gpt4 book ai didi

php - 我需要哪种数据格式来解密存储在 MySQL DB 中的数据?

转载 作者:行者123 更新时间:2023-11-29 02:41:37 25 4
gpt4 key购买 nike

我正在使用 PHP 7.1,研究加密/解密主题。我使用这个函数来编码/解码(基于 PHP 的 official doc ):

$key = openssl_random_pseudo_bytes(16);

function encryptName($plaintext) {
global $key;
// $plaintext - string which must be encrypted

$ivlen = openssl_cipher_iv_length($cipher="AES-128-CBC");
$iv = openssl_random_pseudo_bytes($ivlen);

$ciphertext_raw = openssl_encrypt($plaintext, $cipher, $key, $options=OPENSSL_RAW_DATA, $iv);
$hmac = hash_hmac('sha256', $ciphertext_raw, $key, $as_binary=true);
$ciphertext = base64_encode( $iv.$hmac.$ciphertext_raw );
return $ciphertext;
}

function decryptName($ciphertext) {
global $key;
// $ciphertext - encrypted string

$c = base64_decode($ciphertext);
$ivlen = openssl_cipher_iv_length($cipher="AES-128-CBC");
$iv = substr($c, 0, $ivlen);

$hmac = substr($c, $ivlen, $sha2len=32);
$ciphertext_raw = substr($c, $ivlen+$sha2len);

$original_plaintext = openssl_decrypt($ciphertext_raw, $cipher, $key,
$options=OPENSSL_RAW_DATA, $iv); // | OPENSSL_ZERO_PADDING
$calcmac = hash_hmac('sha256', $ciphertext_raw, $key, $as_binary=true);

if (hash_equals($hmac, $calcmac)) {
//echo $original_plaintext."\n";
}
echo openssl_error_string();
return $original_plaintext;
}

当我 enc/dec strig“MyTestPhrase”时,这两个函数都运行良好。但是当我加密数据然后将其写入 MySQL 表时,解密失败并显示以下错误代码:

error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length

我的 $original_plaintext 等于 bool(false)

我是这样想的。 AES 使用 block 。解密的字符串必须适合 block 长度:解密数据的大小必须是 16 的倍数。如果不是,我们必须激活用 0es 填充它的 PHP 选项。

猜测问题可能与 MySQL 数据格式和加密字符串长度有关,但无法捕获。

请帮我解决上面发布的问题。

最佳答案

所以在我的示例中,我使用 pseudo_bytes 创建了一个 base64_encoded 字符串。这样你的 key 就是不变的。您可以创建自己的 key ,但对于这个例子,我们将使用这个。 LoPCPKd8iDxHvb8mATzhhg==

接下来我们将键定义为常量。这可以在脚本顶部或 conf.php 文件中完成。

接下来我们将在您需要 key 的任何地方使用常量值。

像这样:

define("MYKEY_", base64_decode('LoPCPKd8iDxHvb8mATzhhg=='));

function encryptName($plaintext) {

$ivlen = openssl_cipher_iv_length($cipher="AES-128-CBC");
$iv = openssl_random_pseudo_bytes($ivlen);

$ciphertext_raw = openssl_encrypt($plaintext, $cipher, MYKEY_, $options=OPENSSL_RAW_DATA, $iv);
$hmac = hash_hmac('sha256', $ciphertext_raw, MYKEY_, $as_binary=true);
$ciphertext = base64_encode( $iv.$hmac.$ciphertext_raw );
return $ciphertext;
}

function decryptName($ciphertext) {

$c = base64_decode($ciphertext);
$ivlen = openssl_cipher_iv_length($cipher="AES-128-CBC");
$iv = substr($c, 0, $ivlen);

$hmac = substr($c, $ivlen, $sha2len=32);
$ciphertext_raw = substr($c, $ivlen+$sha2len);

$original_plaintext = openssl_decrypt($ciphertext_raw, $cipher, MYKEY_,
$options=OPENSSL_RAW_DATA, $iv); // | OPENSSL_ZERO_PADDING
$calcmac = hash_hmac('sha256', $ciphertext_raw, MYKEY_, $as_binary=true);

if (hash_equals($hmac, $calcmac)) {
//echo $original_plaintext."\n";
}

echo openssl_error_string();
return $original_plaintext;
}

关于php - 我需要哪种数据格式来解密存储在 MySQL DB 中的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50735546/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com