当密钥设置为$ salt:$ pw时,如果输入错误密码,为什么openssl_decrypt不会失败

时间:2018-09-17 13:03:00

标签: php encryption

最近有一位客户询问要在字符串上设置小的基本级别加密以保存到数据库中,因此我使用openssl_encrypt/openssl_decrypt查找了一个小型教程,并构建了这个代码:

<?php
$str = 'Morbi ac risus et risus consectetur rhoncus. Curabitur et libero ut tellus congue faucibus. Curabitur varius odio sed euismod congue. Pellentesque id lacinia erat, ut fringilla leo. Praesent in orci sagittis lorem ultrices fringilla ac vitae ipsum. Nam viverra ut leo vel ullamcorper. Phasellus lobortis quis orci et sagittis. Mauris fringilla eleifend nunc, a lobortis metus ornare quis. Proin a lacinia sem. Vivamus pulvinar cursus ipsum at vehicula.';

$pw = 'opensesame';
$salt = sha1(mt_rand());
$iv = substr(sha1(mt_rand()), 0, 16);
echo "\n Password: $pw \n Message: $str \n Salt: $salt \n IV: $iv\n";

$encrypted = openssl_encrypt($str, 'AES-128-CBC', "$salt:$pw", null, $iv);
$bundle = "$salt:$iv:$encrypted";
echo " Encrypted bundle = $bundle \n\n";

unset($str, $pw, $salt, $iv, $encrypted);

list($salt, $iv, $encrypted) = explode(':', $bundle);

$pw = 'opensesame';
echo "\n Password: $pw \n Message: $encrypted \n Salt: $salt \n IV: $iv\n";
$str = openssl_decrypt($encrypted, 'AES-128-CBC', "$salt:$pw", null, $iv);
if ($str === false) {
    echo " Invalid password \n\n";
} else{
    echo " Message: $str \n\n ";
}

list($salt, $iv, $encrypted) = explode(':', $bundle);

$pw = 'bork';
echo "\n Password: $pw \n Message: $encrypted \n Salt: $salt \n IV: $iv\n";
$str = openssl_decrypt($encrypted, 'AES-128-CBC', "$salt:$pw", null, $iv);
if ($str === false) {
    echo " Invalid password \n\n";
} else{
    echo " Message: $str \n\n ";
}

最初,我对它成功地加密了字符串,后来又准确地对其解密感到满意。为了更全面,我决定添加一个用例,在该用例中输入了错误的密码,令我感到沮丧的是,错误的密码也可以使用。稍作修改后,我注意到如果加密密钥是$pw:$salt而不是$salt:$pw,则错误的密码将正确地失败。

那为什么呢?我浏览了有关这两个功能的文档,但没有特别注意会引起这种情况的任何内容。这是我的代码以及我如何创建salt和iv的问题吗?

0 个答案:

没有答案
相关问题