Tôi đang cố lưu trữ mật khẩu một cách an toàn trong cơ sở dữ liệu và tôi đã chọn lưu trữ hàm băm của nó được tạo bằng hàm PBKDF2. Tôi muốn làm điều này bằng cách sử dụng thư viện lâu đài bouncy nhưng tôi không biết tại sao tôi không thể làm cho nó hoạt động bằng cách sử dụng giao diện JCE ... Vấn đề là tạo băm trong 3 chế độ khác nhau:
1. sử dụng PBKDF2WithHmacSHA1 nhà máy khóa bí mật được cung cấp bởi ánh nắng mặt trời
2. sử dụng api lâu đài bouncy trực tiếp
3. sử dụng lâu đài bouncy qua JCE
kết quả trong 2 giá trị khác biệt: một chung cho hai đầu tiên và một cho các nhóm thứ ba.PBKDF2 với bouncycastle trong Java
Đây là mã của tôi:
//Mode 1
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec keyspec = new PBEKeySpec("password".toCharArray(), salt, 1000, 128);
Key key = factory.generateSecret(keyspec);
System.out.println(key.getClass().getName());
System.out.println(Arrays.toString(key.getEncoded()));
//Mode 2
PBEParametersGenerator generator = new PKCS5S2ParametersGenerator();
generator.init(PBEParametersGenerator.PKCS5PasswordToUTF8Bytes(("password").toCharArray()), salt, 1000);
KeyParameter params = (KeyParameter)generator.generateDerivedParameters(128);
System.out.println(Arrays.toString(params.getKey()));
//Mode 3
SecretKeyFactory factorybc = SecretKeyFactory.getInstance("PBEWITHHMACSHA1", "BC");
KeySpec keyspecbc = new PBEKeySpec("password".toCharArray(), salt, 1000, 128);
Key keybc = factorybc.generateSecret(keyspecbc);
System.out.println(keybc.getClass().getName());
System.out.println(Arrays.toString(keybc.getEncoded()));
System.out.println(keybc.getAlgorithm());
Tôi biết rằng PBKDF2 được thực hiện sử dụng HMAC SHA1 cho nên đó là lý do tại sao tôi đã chọn như thuật toán trong phương pháp cuối cùng "PBEWITHHMACSHA1" mà tôi lấy từ các tài liệu java lâu đài bouncy .
Kết quả như sau:
com.sun.crypto.provider.SunJCE_ae
[-53, 29, 113, -110, -25, 76, 115, -127, -64, 74, -63, 102, 75, 81, -21, 74]
[-53, 29, 113, -110, -25, 76, 115, -127, -64, 74, -63, 102, 75, 81, -21, 74]
org.bouncycastle.jce.provider.JCEPBEKey
[14, -47, -87, -16, -117, -31, 91, -121, 90, -68, -82, -31, -27, 5, -93, -67, 30, -34, -64, -40]
PBEwithHmacSHA
Bất kỳ ý tưởng?
Tôi không chắc chắn những gì "Chế độ 3" đang làm, nhưng tôi muốn bỏ qua nó. Đầu ra của nó là 160 bit, không phải 128, như bạn đã yêu cầu. 160 bit là kích thước của hàm băm SHA-1. Đối với tính di động, tôi muốn gắn với "Chế độ 1." – erickson
Tôi đồng ý với erickson - có cần thiết thực sự để bạn sử dụng "Chế độ 3" hoặc "Chế độ 1" có thể được chấp nhận để lưu trữ mật khẩu an toàn không? Câu hỏi chi tiết tốt cho câu hỏi đầu tiên của bạn ở đây bằng cách này. –
Không cần thực sự. Tôi chỉ cố gắng hiểu tại sao PBEWITHHMACSHA1 từ BouncyCastle không làm điều tương tự. Và tôi đồng ý, tôi sẽ không chọn phương pháp thứ hai vì các vấn đề về tính di động. –