php AES_DECRYPT与openssl_encrypt配对

ovfsdjhp  于 2023-01-19  发布在  PHP
关注(0)|答案(1)|浏览(115)

我有一个PHP程序,它使用openssl_encrypt将加密数据存储在数据库中。
我需要能够在mysql中解密这些数据,以便对其执行查询。
问题是我不确定在mysql的AES_DECRYPT函数中我的密钥的值应该是什么。
我的php代码使用base64密钥解密为非ascii值。
代码base64对加密的值进行编码,并在末尾添加IV,因此在mysql中,我对此进行解码和拆分。所有这些都工作正常,但当我去解密时,它返回null。大概是因为我不知道如何正确地放入密钥。
我试过UNHEX("key")FROM_BASE64("key")等等

function encrypt($data)
{
    if (!$data) {
        return null;
    }
    $key = "lvvs9pxoekc54zsBpsp+/H1235BdjsAscdRRAxr47uw="; //this is not my real key
    $encryption_key = base64_decode($key);
    $hex = bin2hex($encryption_key);
    $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));
    $encrypted = openssl_encrypt($data, 'aes-256-cbc', $encryption_key, 0, $iv);
    return base64_encode($encrypted . '::' . $iv);
}

在mysql中我是这样做的

AES_DECRYPT(
FROM_BASE64(SUBSTRING_INDEX( 
        UPPER(
            CAST(
                FROM_BASE64(member_ssn)
                AS CHAR(1000)
            )
        ), '::', 1))
        , '*KEY* what do i need to put here?') as decrpyted_string
gkl3eglg

gkl3eglg1#

我得到了这个工作,所以我会张贴我的解决方案,为那些谁关心。
该代码执行以下操作。

  • 获取base64值并对其进行解码
  • 这将产生base64cryptstring::IV的值
  • 然后在::处拆分字符串把静脉注射和密码串分开
  • 然后,它使用这些值和密钥本身上的FROM_BASE64来获取解密值
SELECT dec_data.member_id, CONVERT(dec_data.dec_ssn USING LATIN1) as dec_ssn FROM (
                    select 
                        *,                        
                        CAST(
AES_DECRYPT(
    FROM_BASE64(SUBSTRING_INDEX(CAST(FROM_BASE64(member_ssn)AS CHAR(1000)), '::', 1)), 
    FROM_BASE64('yourbase64keyhere=='),                         
    SUBSTRING_INDEX(SUBSTRING_INDEX(FROM_BASE64(member_ssn), '::', 2), '::', -1)
) AS CHAR) as dec_ssn 
                        from lb_1_members where member_ssn is not null AND member_ssn != '') dec_data

相关问题