Tôi có một bảng SQL với tên người dùng và mật khẩu. Các mật khẩu được mã hóa bằng phương thức digest() của MessageDigest. Nếu tôi mã hóa mật khẩu - giả sử "abcdef12" - với phương thức digest() của MessageDigest và sau đó chuyển đổi nó thành giá trị thập lục phân, thì String khác với nếu tôi làm như vậy bằng cách sử dụng phương thức SHA1 của PHP. Tôi hy vọng những giá trị này sẽ giống hệt nhau.Thuật toán MessageDigest SHA1 của Java trả về kết quả khác với hàm SHA1 của hàm php
Mã được sử dụng để mã hóa các mật khẩu:
MessageDigest md = MessageDigest.getInstance("SHA-1");
byte[] passbyte;
passbyte = "abcdef12".getBytes("UTF-8");
passbyte = md.digest(passbyte);
Việc quy đổi của String để hệ thập lục phân được thực hiện bằng phương pháp này:
public static String convertStringToHex(String str) {
char[] chars = str.toCharArray();
StringBuffer hex = new StringBuffer();
for (int i = 0; i < chars.length; i++) {
hex.append(Integer.toHexString((int) chars[i]));
}
return hex.toString();
}
Mật khẩu: abcdef12
Dưới đây là mật khẩu được trả về bởi rất nhiều trình tạo trực tuyến SHA1-băm và hàm PHP SHA1(): d253e3b d69ce1e7ce6074345fd5faa1a3c2e89ef
Dưới đây là mật khẩu như mã hóa bởi MessageDigest: d253e3bd69ce1e7ce674345fd5faa1a3c2e2030ef
Tôi quên cái gì?
Igor.
Chỉnh sửa: Tôi đã tìm thấy ai đó có vấn đề tương tự: C# SHA-1 vs. PHP SHA-1...Different Results?. Giải pháp là thay đổi mã hóa .. nhưng tôi không thể thay đổi mã hóa ở phía máy chủ vì các mật khẩu trong bảng SQL đó không được tạo bởi ứng dụng của tôi. Tôi sử dụng mã hóa SHA1 phía máy khách bằng cách sử dụng lớp JavaScript SHA1 (chính xác hơn: lớp Google Toolkit-class). Nó hoạt động và mã hóa các chuỗi như mong đợi, nhưng dường như sử dụng các ký tự ASCII ..
Cảm ơn bạn! Câu trả lời của bạn đã giải quyết được vấn đề của tôi. Tôi đã thất bại trong việc chuyển đổi mảng byte thành chuỗi thập lục phân đúng cách! Tôi đã sử dụng phương pháp này từ @stivlo và nó hoạt động rất tốt! Tôi sẽ đánh dấu phản ứng này là chính xác, mặc dù trong trường hợp này tôi ước tôi có thể đánh dấu cả hai câu trả lời cho trước là câu trả lời chính xác! Cảm ơn cả hai người! – Igor