我有一個包含用戶名和密碼的SQL表。密碼使用MessageDigest的摘要()方法進行編碼。如果我使用MessageDigest的digest()方法對密碼進行編碼(比如說「abcdef12」),然後將其轉換爲十六進制值,則String與使用PHP的SHA1方法執行相同操作時不同。我希望這些值是完全一樣的。用來編碼密碼Java的MessageDigest SHA1算法返回的結果不是SHA1的函數php
代碼:
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();
}
密碼:abcdef12
這裏的
MessageDigest md = MessageDigest.getInstance("SHA-1");
byte[] passbyte;
passbyte = "abcdef12".getBytes("UTF-8");
passbyte = md.digest(passbyte);
字符串爲十六進制的轉換就是採用這種方法來完成由許多SHA1-Hash在線生成器和PHP SHA1()返回的密碼 - 功能:d253e3b d69ce1e7ce6074345fd5faa1a3c2e89ef
這裏的密碼通過消息摘要作爲編碼:d253e3bd69ce1e7ce674345fd5faa1a3c2e2030ef
我是不是忘了什麼東西?
伊戈爾。
編輯:我發現有人有類似的問題:C# SHA-1 vs. PHP SHA-1...Different Results?。解決方案是更改編碼..但我不能更改服務器端的編碼,因爲該SQL表中的密碼不是由我的應用程序創建的。 我使用JavaScript SHA1類(更精確地說:Google Web Toolkit類)使用客戶端SHA1編碼。它的工作原理,並預期編碼字符串,但顯然使用ASCII字符..
謝謝!你的答案解決了我的問題。我無法正確地將字節數組轉換爲十六進制字符串!我使用@stivlo的方法,它效果很好!我打算將這個回答標記爲正確的,但在這種情況下,我希望我可以將兩個回答都標記爲正確回答!謝謝你們倆! – Igor