我有一个问题,我无法解决......
说明:
我的功能:
public function GetSign($str) {
$strSIGN = sha1($str, true);
$strSIGN = substr($strSIGN, 0, 16);
$td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
mcrypt_generic_init($td, self::KEY, $iv);
$strSIGN = mcrypt_generic($td, substr($strSIGN, 0, 16));
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
$strSIGNhex = '';
for ($i = 0; $i < strlen($strSIGN); $i++)
{
$ord = ord($strSIGN[$i]);
$hexCode = dechex($ord);
$strSIGNhex .= ((strlen($hexCode) == 1) ? '0' : '') . $hexCode;
}
return $strSIGNhex;
}
但结果不正确...... 有什么建议吗?
答案 0 :(得分:0)
您确定,结果不正确吗? AES256根据iv返回不同的值,在您的情况下是随机的。
在不同的执行后拥有不同的签名是完全可以接受的 - 唯一的要求是,您可以验证输出是否正确。
答案 1 :(得分:0)
我不确定此说明应该解决什么问题。据我所知,您希望使用哈希和密钥生成签名。通常使用HMAC来解决此问题。
使用您的代码,您将无法重新创建签名以进行验证,因为您使用带有IV(初始化向量)的CBC模式。这实际上是一件好事,但您也必须存储IV,因此您可以使用相同的IV加密另一个字符串并进行验证。当然,存储IV将导致比16字节更长的字符串。
要么使用不需要IV的ECB模式,要么使用为此类情况制作的HMAC。