带有SHA1和AES 256的PHP安全代码

时间:2014-06-13 17:29:30

标签: php hash sha1

我有一个问题,我无法解决......

说明:

  1. 使用字符串
  2. 中的SHA1创建哈希
  3. 从字符串中取出前16个字节,并使用AES256和KEY
  4. 对其进行编码
  5. 您获得16个字节的签名。您必须将此签名转换为32字节字符串,表示十六进制中的签名
  6. 我的功能:

    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;
            }                             
    

    但结果不正确...... 有什么建议吗?

2 个答案:

答案 0 :(得分:0)

您确定,结果不正确吗? AES256根据iv返回不同的值,在您的情况下是随机的。

在不同的执行后拥有不同的签名是完全可以接受的 - 唯一的要求是,您可以验证输出是否正确。

答案 1 :(得分:0)

我不确定此说明应该解决什么问题。据我所知,您希望使用哈希和密钥生成签名。通常使用HMAC来解决此问题。

使用您的代码,您将无法重新创建签名以进行验证,因为您使用带有IV(初始化向量)的CBC模式。这实际上是一件好事,但您也必须存储IV,因此您可以使用相同的IV加密另一个字符串并进行验证。当然,存储IV将导致比16字节更长的字符串。

要么使用不需要IV的ECB模式,要么使用为此类情况制作的HMAC。