2010-11-17 71 views
5

Tôi đang cố gắng sao chép hành vi Convert.ToBase64String() trong Ruby.C# để mã hóa Ruby sha1 base64

Đây là mã # C của tôi:

var sha1 = new SHA1CryptoServiceProvider(); 
var passwordBytes = Encoding.UTF8.GetBytes("password"); 
var passwordHash = sha1.ComputeHash(passwordBytes); 
return Convert.ToBase64String(passwordHash); // returns "W6ph5Mm5Pz8GgiULbPgzG37mj9g=" 

Khi tôi cố gắng điều tương tự trong Ruby, tôi nhận được một chuỗi base64 khác nhau cho các băm SHA1 cùng:

require 'digest/sha1' 
require 'base64' 
sha1 = Digest::SHA1.hexdigest('password') 
# sha1 = 5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8 
base64 = Base64.strict_encode64(sha1) 
# base64 = "NWJhYTYxZTRjOWI5M2YzZjA2ODIyNTBiNmNmODMzMWI3ZWU2OGZkOA==" 

tôi xác minh trong debugger mảng C# passwordBytes phù hợp với giá trị sha1 trong ví dụ Ruby. Có một cách đặc biệt tôi cần phải sử dụng Base64 trong Ruby để có được cùng một chuỗi mã C# sản xuất?

Trả lời

6

Bạn đang base64 mã hóa chuỗi "5baa61...", không "\x5b\xaa\x61..."

Thay đổi hexdigest-digest:

sha1 = Digest::SHA1.digest('password') 
base64 = Base64.strict_encode64(sha1) 
2

C# của bạn và mã Ruby đang làm những điều hơi khác nhau. Trong mã C# của bạn, passwordHash là một byte [20]. Trong mã Ruby của bạn, sha1 chứa một chuỗi gồm 40 ký tự. Vì vậy, bạn đang mã hóa Base64 hai thứ khác nhau. Do đó các kết quả khác nhau.

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