2008-12-05 34 views
7

Tôi đang viết lại một trang web PHP trong ASP.NET MVC. Tôi muốn duy trì cùng một cơ sở người dùng nhưng các mật khẩu được băm bằng cách sử dụng hàm PHP crypt(). Tôi cần cùng một chức năng trong. Net để tôi có thể băm mật khẩu khi đăng nhập và kiểm tra nó với mật khẩu băm trong cơ sở dữ liệu người dùng.Hàm PHP crypt() trong .Net?

hầm mộ trong trường hợp này là sử dụng thực hiện CRYPT_MD5 - băm tất cả bắt đầu với $ 1 $

Tôi đã thử Phalanger nhưng nó không có một thực hiện MD5 của hàm crypt.

Có ai biết một trong .Net? Ví dụ C# của crypt() trên CodeProject sử dụng DES, chứ không phải MD5.

Tôi đã thử mã sau trong C#, với các hoán vị khác nhau của muối + mật khẩu, mật khẩu + muối và muối có và không có tiền tố $ 1 $ và $ hậu tố. Không đưa ra kết quả tương tự như PHP:

static void Main(string[] args) 
{ 
    const string salt = "somesalt"; 
    const string password = "fubar"; 
    const string plaintextString = password + salt; 
    byte[] plaintext = GetBytes(plaintextString); 
    var md5 = MD5.Create("MD5"); 
    byte[] hash = md5.ComputeHash(plaintext); 
    string s = System.Convert.ToBase64String(hash); 
    Console.WriteLine("Hash of " + password + " is " + s); 
    Console.ReadKey(); 
} 

private static byte[] GetBytes(string s) 
{ 
    var result = new byte[s.Length]; 
    for (int i = 0; i < s.Length; i++) 
     result[i] = (byte)s[i]; 
    return result; 
} 
+0

MD5 không được xem là một hash an toàn và bạn có thể muốn nâng cấp hệ thống của bạn để SHA-256. – TravisO

+0

btw, 'Bảng điều khiển.WriteLine ("Hash của {0} là {1}", mật khẩu, s); ' – abatishchev

+1

Abatishchev, đây là một sự tăng đột biến nhanh chóng để kiểm tra xem tôi có thể tạo ra cùng một giá trị băm như PHP cho một chuỗi đầu vào đã cho hay không. Nhận xét của bạn hoàn toàn không có chủ đề và ít hữu ích hơn. –

Trả lời

0

Giải pháp duy nhất tôi thấy được để gọi một kịch bản PHP tầm thường mà chỉ đơn giản thực hiện một băm của chuỗi đầu vào và trả về nó :-(

2

Có một vài phương pháp NET cho md5 băm, System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(password, format) là dễ nhất để sử dụng, mặc dù đó là một miếng. Chỉ cần chuyển "md5" qua làm định dạng.

Tùy thuộc vào cách PHP đang thực hiện việc này, nó có thể đơn giản như cắt bớt $1$ khỏi đầu băm khi bạn nhập. Nó có thể phức tạp hơn. Nếu bạn có thể đăng một mật khẩu ví dụ/băm, tôi sẽ xem nếu tôi có thể đưa ra một số C# tạo ra cùng một băm từ mật khẩu đó cho bạn.

+0

Tôi đã thử băm MD5 trong. Net, nhưng nó dẫn đến một băm khác với những gì tôi thấy bằng cách sử dụng PHP crypt() –

1

Bạn đã xem xét .NET MD5 class chưa? $ 1 $ là một phần của muối 12 ký tự.

0

Tôi hiện đang làm việc trên chính xác cùng một vấn đề. Các giải pháp tôi đưa ra là để gọi hàm php trực tiếp thông qua một cuộc gọi extern:

[DllImport("php5ts.dll", EntryPoint = "crypt", CharSet = CharSet.Ansi)] 
private static extern string crypt(string str, string salt); 

này hoạt động tốt cho php phiên bản 5.2.10 khi chạy máy chủ Webdev địa phương, IIS5 và IIS6 nhưng nếu bạn sử dụng các II7 ASP.Net quá trình công nhân treo với một ngoại lệ unhandled. (Tôi sẽ cập nhật câu trả lời ngay sau khi tìm thấy giải pháp)

Chúng tôi cũng bao gồm cờ loại mật khẩu để cho phép chúng tôi sử dụng triển khai .Net MD5 cho tất cả người dùng mới và chuyển đổi liền mạch người dùng hiện tại khi họ cập nhật chi tiết.

Cập nhật: Vấn đề với tham chiếu php5ts.dll trực tiếp từ IIS7 dường như rất dễ sử dụng cửa sổ 64 bit, vì vậy giải pháp này có thể hoạt động trên cài đặt Windows 7 hoặc Server 2008 32 bit. để xác minh điều này. Khi nó bật ra trang web hiện tại của chúng tôi đã được sử dụng DES vì vậy chúng tôi đã có thể sử dụng việc thực hiện crypt từ CodeProject, cảm ơn Mike tham khảo.

Các vấn đề liên quan