Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 加密/哈希问题_Php_Hash_Sha1_Mcrypt_Rijndael - Fatal编程技术网

Php 加密/哈希问题

Php 加密/哈希问题,php,hash,sha1,mcrypt,rijndael,Php,Hash,Sha1,Mcrypt,Rijndael,我正在开发一个小脚本,它允许我将相对安全的信息存储在cookie中,以验证用户登录,而无需使用会话。输出的一部分是一个加密的salt,当使用存储在cookie中的一些信息和数据库中的一些用户信息生成hmac_哈希时使用 然而,在一些测试之后,我遇到了字符串加密/解密的问题,并导致了不同的哈希结果 即: 而我的结局是 $hash1 - d4fbef92af33c1789d9130384a56737d181cc6df $hash2 - 0d6034f417c2cfe1d60d263101dc0f8

我正在开发一个小脚本,它允许我将相对安全的信息存储在cookie中,以验证用户登录,而无需使用会话。输出的一部分是一个加密的salt,当使用存储在cookie中的一些信息和数据库中的一些用户信息生成hmac_哈希时使用

然而,在一些测试之后,我遇到了字符串加密/解密的问题,并导致了不同的哈希结果

即:

而我的结局是

$hash1 - d4fbef92af33c1789d9130384a56737d181cc6df 
$hash2 - 0d6034f417c2cfe1d60d263101dc0f8354a1216f
但当我回显这两个字符串时,它们都是123456abcdef

do_encrypt函数如下所示:

function do_encrypt($value) {

    $salt = generate_salt();
    $td = mcrypt_module_open('rijndael-256', '', 'cbc', '');
    mcrypt_generic_init($td, $ek, $salt);
    $encrypted_data = mcrypt_generic($td, $value);

    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);
    return base64_encode($salt.$encrypted_data);    
}
do_decrypt函数:

function do_decrypt($value) {

    $data = base64_decode($value);
    $salt = substr($data, 0, 32);
    $data = substr($data, 32, strlen($data));
    $td = mcrypt_module_open('rijndael-256', '', 'cbc', '');
    mcrypt_generic_init($td, $ek, $salt);
    $decrypted_data = mdecrypt_generic($td, $data);

    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);
    return $decrypted_data;
}
对于这两个函数,$ek是从另一个文件提取的加密密钥

我试图理解为什么显示的字符是相同的,但实际变量是不同的(否则散列结果将是相同的),有没有办法确保两个字符串在散列时是相同的

谢谢,
Ryan。

根据评论,您似乎得到了尾随的空值-很可能mcrypt的块大小为32字节,任何加密/解密的字符串都必须是这么多字节的倍数

摘自文件:

如果数据的大小不是n*blocksize,则数据将填充“\0”


但是你刚才说加密会生成一个随机的salt,当你解密它时,你怎么知道这个salt呢?你能给我们看一下函数吗?加密/解密与散列无关,只有散列才能将一个散列值与另一个生成的散列值相匹配。加密
=哈希。@jaredfarrish我知道两者的区别。我正在加密要存储在cookie中的另一个片段,当它被检索时,我可以解密用作hmac salt的值。@mazzzz我添加了do_encrypt函数。使用您自己的加密技术很容易出错。你需要非常有条不紊地做你正在做的事情。如果可以,看一看;在进行加密和散列时,使用已知的、经过验证的技术几乎总是比使用国产技术更好。你是对的。正在执行$v2=str_替换(“\0”,”,$v2);在字符串上,使哈希值相同。谢谢
function do_decrypt($value) {

    $data = base64_decode($value);
    $salt = substr($data, 0, 32);
    $data = substr($data, 32, strlen($data));
    $td = mcrypt_module_open('rijndael-256', '', 'cbc', '');
    mcrypt_generic_init($td, $ek, $salt);
    $decrypted_data = mdecrypt_generic($td, $data);

    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);
    return $decrypted_data;
}