2010-05-31 31 views
5

Tôi hiện đang cố gắng để nâng cấp một dự án của tôi từ .NET 3.5 để NET 4.0SHA1CryptoServiceProvider thay đổi trong .NET 4

Mọi thứ đã diễn ra rất tốt, tất cả các mã biên soạn, tất cả các xét nghiệm thông qua.
Sau đó, tôi đã gặp sự cố khi triển khai môi trường dàn dựng của mình.
Đột nhiên, thông tin đăng nhập của tôi không còn hoạt động nữa.

Dường như SHA1 băm mật khẩu của tôi đang bị băm khác nhau trong .NET 4.

Tôi đang sử dụng SHA1CryptoServiceProvider:

SHA1CryptoServiceProvidercryptoTransformSHA1 = new SHA1CryptoServiceProvider(); 

Để kiểm tra tôi đã tạo một dự án Visual Studio mới với 2 giao diện điều khiển các ứng dụng.
Nhắm mục tiêu đầu tiên tại .NET Framework 3.5 và phiên bản thứ hai ở mức 4.0.
Tôi chạy chính xác cùng một mã băm trong cả hai và các kết quả khác nhau được tạo ra.

Tại sao điều này xảy ra và làm cách nào để khắc phục sự cố này?
Tôi rõ ràng không thể cập nhật tất cả mật khẩu người dùng của mình vì tôi không biết chúng là gì.

Mọi trợ giúp sẽ được đánh giá cao.

MÃ MẪU

public static class SHA1Hash 
{ 

    public static string Hash(string stringToHash) 
    { 
     return (Hash(stringToHash, Encoding.Default)); 
    } 

    public static string Hash(string stringToHash, Encoding enc) 
    { 
     byte[] buffer = enc.GetBytes(stringToHash + stringToHash.Reverse()); 
     var cryptoTransformSHA1 = new SHA1CryptoServiceProvider(); 
     string hash = BitConverter.ToString(cryptoTransformSHA1.ComputeHash(buffer)); 
     return hash; 
    } 
} 
+0

thể trùng lặp của [Đăng nhập thất bại sau khi nâng cấp lên ASP.net 4.0 từ 3,5] (http://stackoverflow.com/questions/2739196/login -fails-after-upgrade-to-asp-net-4-0-from-3-5) - giải pháp bao gồm –

+0

tiếc là đây không phải là trường hợp tương tự. Điều này liên quan đến FormsAuthenticationCookies và ViewState và chỉ là một vấn đề "nếu bạn chạy hỗn hợp ASP.NET 2.0/ASP.NET 4". Nhưng DANG tôi nghĩ đó là giải pháp của tôi – WebDude

+0

Bạn có thể xóa nhầm lẫn AsymetricHash/Hash không? Chỉ để được an toàn. –

Trả lời

2

Một trong những ý kiến ​​đưa tôi lên tìm lỗi trong mã của tôi.
Khi tạo mảng byte của tôi để được băm, tôi đã cố gắng nối chuỗi với một phiên bản đảo ngược của chính nó.

Ví dụ: cho "password" để băm Tôi thực sự sẽ băm "passworddrowssap"

Tuy nhiên mã của tôi có một lỗi nhỏ trong nó:

.Reverse() là một phương pháp mở rộng LINQ có thể đảo ngược một chuỗi.
Tuy nhiên nó không trả về một chuỗi, nó sẽ trả về:

IEnumerable<Char> 

Gọi ToString() trên kiểu này thực sự trả về:

System.Linq.Enumerable + d__99`1 [System. char]

Làm điều tương tự trong .NET 4.0 trở

S ystem.Linq.Enumerable + d__a0`1 [System.Char]

Do đó mật khẩu của tôi đã bị băm khác nhau.
Những gì tôi nên làm để tạo ra bởi mảng byte là:

byte[] buffer = enc.GetBytes(stringToHash + new String(stringToHash.Reverse().ToArray())); 
0

Âm thanh như nó có thể là nhân vật vấn đề mã hóa. Đảm bảo rằng các chuỗi được băm là trong mã hóa [utf8, ansi vv] bạn mong đợi (và nếu có, đảm bảo rằng môi trường cũ quá.)

-Oisin

+0

Tôi đã sử dụng Encoding.Default. Tôi đã thử chỉ định Mã hóa và không có cách nào trong số các thao tác sau: Mã hóa.ASCII, Encoding.BigEndianUnicode, Encoding.Unicode, Encoding.UTF32, Encoding.UTF7, Encoding.UTF8 – WebDude

+0

hashing hoạt động ở cấp luồng byte - Tôi là không chắc chắn nếu bạn hiểu tôi. Bạn đang xác định mã hóa ở đâu? Tất cả những gì quan trọng là cả hai hệ thống đều được kiểm tra để nuôi cùng _bytes_ với lớp sha1. – x0n

+0

vui lòng xem mẫu mã là phương pháp tôi gọi. Cả hai trang web đang chạy trên cùng một máy chủ chính xác vì vậy tôi không chắc chắn mã hóa sẽ thay đổi ở đâu. Làm thế nào tôi có thể xác minh rằng cả hai hệ thống đang nuôi cùng một byte với lớp sha1? theo mẫu mã trên của tôi, tôi có thể kiểm tra buffer.Length không? – WebDude

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