在爲網站準備訪問數據時,我突然意識到由Java創建的MD5加密密碼與由PHP MD5創建的密碼完全不同。仔細查看這裏和其他地方的帖子,我發現了幾種Java解決方案,確保它們能夠提供與PHP完全相同的結果 - 但是所有的Java實現在它們之間提供了相同的結果,但是與PHP的結果完全不同。爲什麼Java MD5和PHP MD5提供完全不同的結果?
因此,我編寫了一個小型Java程序,它將相同的密碼發送到我的本地服務器以供PHP轉換,並且同時使用Java自行轉換它。這裏的程序:
public PHPDriver() {
String pwd = "aabbccdd";
String p = encodeByPHP("http://localhost/testsite/md5.php?pwd=" + pwd);
System.out.println("PHPDriver: " + pwd + " -> " + p);
System.out.println("md5: " + pwd + " -> " + md5(p));
...
public String encodeByPHP(String url) {
try {
// create a link to a URL
URL urlAddress = new URL(url);
URLConnection link = urlAddress.openConnection();
BufferedReader inStream = new BufferedReader(new InputStreamReader(link.getInputStream()));
return inStream.readLine();
} catch (MalformedURLException e) {
...
public String md5(String input) {
String result = input;
try {
if(input != null) {
MessageDigest md = MessageDigest.getInstance("MD5"); //or "SHA-1"
md.update(input.getBytes());
BigInteger hash = new BigInteger(1, md.digest());
result = hash.toString(16);
while(result.length() < 32) {
result = "0" + result;
}
}
} catch (NoSuchAlgorithmException nsa) {
而且(絕大多數複雜;-) PHP頁面:
<?php
$pwd = $_GET['pwd'];
// echo $pwd . ' -> ';
echo sha1($pwd);
?>
這樣做的結果如下所示:
PHPDriver: aabbccdd -> 527bee2730bf234e9a78bde5af091ece9c6302d5
md5: aabbccdd -> ab86815613f7f321001efef1935dbe7d
什麼錯嗎?這是一個錯誤的編碼問題?爲什麼PHP的結果是40字符而不是通常的32?
'sha1'不是'md5'。 – datasage
它看起來像你的php代碼使用SHA1哈希算法,而你的java代碼使用MD5 ... –
請注意輸出的* length * SHA-1是160位,20個字節,40個十六進制字符; MD5 128位,16個字節,32個十六進制字符。 – 2013-01-22 20:09:21