Java和PHP中的相同散列算法会产生不同的结果

时间:2018-02-13 14:29:48

标签: java php algorithm encryption

我在java和php平台上使用相同的数据库集成相同的登录功能,但在密码算法方面存在一些问题。

这是我的java代码: -

public static String encryptPassword(String strToEncrypt,String saltToEncrypt)      
{
    String encryptedString = "";
    String stringToEncrypt = "";
    byte[] encodedValue;

    stringToEncrypt = strToEncrypt + saltToEncrypt;

    encodedValue = Base64.encodeBase64(DigestUtils.sha256(stringToEncrypt
            .getBytes()));
    encryptedString = new String(encodedValue);

    return encryptedString;
}

这是我的PHP代码: -

  function  encryptPassword($strToEncrypt, $saltToEncrypt) 
  {
    $stringToEncrypt = $strToEncrypt.$saltToEncrypt;

    $encodedValue = base64_encode(hash('sha256', $stringToEncrypt));

    return $encodedValue;
 }

理想情况下,这两个函数都应生成相同的加密字符串,但这些字符会产生不同的结果。 我的代码出了什么问题?请指教。

1 个答案:

答案 0 :(得分:0)

这是因为SHA-256函数对返回值使用的格式不同。 PHP中的hash函数默认返回十六进制字符串,但您可以选择使用RAW_OUTPUT参数(参考here)输出原始字符串:

$encodedValue = base64_encode(hash('sha256', $stringToEncrypt, TRUE)); 

或者,您可以更改Java端并在Apache Commons Codec中使用名为sha256Hex的方法,该方法采用String并以十六进制形式返回哈希:

// You don't need the getBytes here
encodedValue = Base64.encodeBase64(DigestUtils.sha256Hex(stringToEncrypt));