我可以在PHP與鹽簡單地散列:在java中完全相同的哈希PHP與鹽? (SHA-256)
$orig_pw = "abcd";
$salt = 5f8f041b75042e56;
$password = hash('sha256', $orig_pw . $salt);
(這不是我如何實現它,這只是一個例子鹽是每個人不同)
而且與此相關,存儲的口令是:
bc20a09bc9b3d3e1fecf0ed5742769726c93573d4133dbd91e2d309155fa9929
但是,如果我嘗試做在Java中一樣,我得到不同的結果。我試圖String password = "abcd";
byte[] salt = hexStringToByteArray("5f8f041b75042e56");
try {
System.out.println(new String(getHash(password, salt)));
} catch (NoSuchAlgorithmException e1) {
e1.printStackTrace();
}
而且,這兩個方法:
public byte[] getHash(String password, byte[] salt) throws NoSuchAlgorithmException {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
digest.reset();
digest.update(salt);
try {
return digest.digest(password.getBytes("UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
public byte[] hexStringToByteArray(String s) {
int len = s.length();
byte[] data = new byte[len/2];
for (int i = 0; i < len; i += 2) {
data[i/2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
+ Character.digit(s.charAt(i+1), 16));
}
return data;
}
結果是:
/¬1¶ĆĽëüFd?[$?¶»_9ËZ»ç¶S‘Ęŗש
其中編碼爲十六進制甚至沒有接近它:
2fac31b6434c14ebfc46643f5b243fb6bb5f39cb5abb10e7b65391454c97d7a90d0a
任何人都可以埃爾普與此?
我不明白每一個字(不是英文)。那麼我應該改變java中的salt嗎? (如:byte [] salt =「5f8f041b75042e56」.getBytes();)另外,我如何在java中交換它們? – RuntimeException
我不知道你的實際PHP代碼是什麼樣子的(你發佈的代碼將不會運行,因爲它只有十六進制字符串)。但似乎你在哈希''abcd「。」5f8f041b75042e56「'。要做到Java中的等價物,你必須做'(「password」+「salt」)。getBytes(「UTF-8」),然後消化它。 –
對代碼抱歉,這不是它的實現。實際的代碼得到一個隨機數:$ salt = dechex(mt_rand(0,2147483647))。 dechex(mt_rand(0,2147483647)); – RuntimeException