Tôi có một cơ sở dữ liệu lớn của người dùng (~ 200.000) mà tôi đang chuyển từ một ứng dụng ASP.NET sang ứng dụng Ruby on Rails. Tôi không thực sự muốn yêu cầu mọi người dùng đặt lại mật khẩu của họ và vì vậy tôi đang cố gắng triển khai lại hàm băm mật khẩu C# trong Ruby.Thực hiện lại ASP.NET Membership và Mật khẩu người dùng Hashing trong Ruby
Chức năng cũ là thế này:
public string EncodePassword(string pass, string saltBase64)
{
byte[] bytes = Encoding.Unicode.GetBytes(pass);
byte[] src = Convert.FromBase64String(saltBase64);
byte[] dst = new byte[src.Length + bytes.Length];
Buffer.BlockCopy(src, 0, dst, 0, src.Length);
Buffer.BlockCopy(bytes, 0, dst, src.Length, bytes.Length);
HashAlgorithm algorithm = HashAlgorithm.Create("SHA1");
byte[] inArray = algorithm.ComputeHash(dst);
return Convert.ToBase64String(inArray);
}
Một ví dụ băm mật khẩu và muối là (và mật khẩu được sử dụng là "password"):
băm mật khẩu: "weEWx4rhyPtd3kec7usysxf7kpk =" Salt: " 1ptFxHq7ALe7yXIQDdzQ9Q ==" Mật khẩu: "password"
Bây giờ với các mã Ruby sau:
require "base64"
require "digest/sha1"
password = "password"
salt = "1ptFxHq7ALe7yXIQDdzQ9Q=="
concat = salt+password
sha1 = Digest::SHA1.digest(concat)
encoded = Base64.encode64(sha1)
puts encoded
Tôi không nhận được mật khẩu băm đúng (Tôi nhận được "+ BsdIOBN/Vh2U7qWG4e + O13h3iQ =" thay vì "weEWx4rhyPtd3kec7usysxf7kpk ="). Có ai có thể thấy vấn đề có thể là gì không?
Rất cám ơn
Arfon
Bạn đang bỏ qua một bước quan trọng: chuyển đổi mật khẩu vào byte. –
OK, có vẻ như tôi sẽ phải giảm xuống mức byte để thực hiện việc này? – arfon
@Adam - không chắc chắn. Trong .NET nó đặt chúng vào một mảng byte để chuyển sang thuật toán băm. Ruby thực sự có thể làm điều tương tự bằng cách sử dụng một chuỗi đơn giản. Nếu chúng được lưu trữ dưới dạng null, nó cơ bản giống như bộ đệm trong ví dụ .NET. Tôi sẽ cho nó xoáy và xem nó có hiệu quả không. – tvanfosson