【发布时间】:2021-05-27 02:23:16
【问题描述】:
设置:
session_start();
function set_encryption_method() {
if (isset($_SESSION['last_activity']) && (time() - $_SESSION['last_activity']) > 3600) {
unset($_SESSION['cipher']);
unset($_SESSION['iv']);
unset($_SESSION['last_activity']);
}
$cipher = 'aes-256-cbc';
$iv = random_bytes(16);
if (in_array($cipher, openssl_get_cipher_methods())) {
if (!isset($_SESSION['cipher'])) {
$_SESSION['cipher'] = $cipher;
}
if (!isset($_SESSION['iv'])) {
$_SESSION['iv'] = $iv;
}
$_SESSION['last_activity'] = time();
} else {
die('Encryption method not supported!');
}
}
set_encryption_method();
加密:
function encrypt_string($key, $string) {
// $key is a constant stored in a database
return rawurlencode(base64_encode(openssl_encrypt($string, $_SESSION['cipher'], $key, 0, $_SESSION['iv'])));
}
解密:
function decrypt_string($key, $encrypted) {
// $key is a constant stored in a database
return openssl_decrypt(rawurldecode(base64_decode($encrypted)), $_SESSION['cipher'], $key, 0, $_SESSION['iv']);
}
当使用适当的参数调用decrypt_string() 时,它会抛出此错误:digital envelope routines evp_decrypt_final_ex: bad decrypt。如果我对 iv 进行硬编码,那么它可以正常工作。
我做错了什么?
【问题讨论】:
-
您为什么不调试“openssl_encrypt”和“openssl_decrypt”的输入,然后“跟踪数据”以找出IV get 的更改位置?
-
很遗憾,我无法控制服务器,公司也不允许安装 XDebug 之类的东西
-
回显 iv 的 base64_Encode 和 strlen。 strlen 确认它已设置,base64_encode 确认它们都是相同的。
-
你能提供更多关于你的环境的信息吗?我cannot reproduce.
-
通常情况下,您会将加密数据和 IV 存储在一起,因为只有在两者都保持不变的情况下才能进行解密。您能否确认您使用相同的 IV 进行加密和解密?您是否不会在两个不同的会话中调用加密和解密功能?或者在两者之间调用
set_encryption_method(),而一个多小时过去了?
标签: php encryption openssl