Mysql AES_ENCRYPT=>;客户端JavaScript Aes.Ctr.decrypt问题

Mysql AES_ENCRYPT=>;客户端JavaScript Aes.Ctr.decrypt问题,javascript,mysql,encryption,Javascript,Mysql,Encryption,案例 我在MySQL数据库中有一些敏感数据,我想在执行SELECT语句时对其进行加密。然后我想用JavaScript在客户端解密它 以下是一些例子: MySQL select语句: SELECT HEX( AES_ENCRYPT( 'text', 'secret' ) ) 结果: CAC9877FC9203920EC4C0E8F1CB5C49C WordArray.t.extend.init { words: Array[8], sigBytes: 24, in

案例

我在MySQL数据库中有一些敏感数据,我想在执行SELECT语句时对其进行加密。然后我想用JavaScript在客户端解密它

以下是一些例子:

MySQL select语句:

SELECT HEX( AES_ENCRYPT( 'text', 'secret' ) )
结果:

CAC9877FC9203920EC4C0E8F1CB5C49C
WordArray.t.extend.init 
{
    words: Array[8], 
    sigBytes: 24, 
    init: function, 
    toString:function, 
    concat: function…
}

    sigBytes: 24
    words: Array[8]
    0: -140444473
    1: 2005116093
    2: -506226828
    3: -210568886
    4: -277754559
    5: 880241217
    6: 598097705
    7: -2102072885
    length: 8
    __proto__: Array[0]
    __proto__: s
对于客户端AES JavaScript解密实现,我尝试了以下库:和

对于Crypto js,我遵循了Mysql AES加密参数(此处描述:),使其与客户端解密参数相等,但不起作用

对于第二个库,它似乎也不起作用

使用Crypto js的示例代码:

CryptoJS.AES.decrypt(
    'CAC9877FC9203920EC4C0E8F1CB5C49C',
    'secret',
    {
        mode: CryptoJS.mode.CTR,
        padding: CryptoJS.pad.ZeroPadding
    }
);
结果:

CAC9877FC9203920EC4C0E8F1CB5C49C
WordArray.t.extend.init 
{
    words: Array[8], 
    sigBytes: 24, 
    init: function, 
    toString:function, 
    concat: function…
}

    sigBytes: 24
    words: Array[8]
    0: -140444473
    1: 2005116093
    2: -506226828
    3: -210568886
    4: -277754559
    5: 880241217
    6: 598097705
    7: -2102072885
    length: 8
    __proto__: Array[0]
    __proto__: s
使用高级加密标准库的客户端解密实现示例:

Aes.Ctr.decrypt(window.atob('CAC9877FC9203920EC4C0E8F1CB5C49C'), 'secret', 128);
结果:
“40”bÞøgÈ“

结果:
“ӽ+”¾%[ø\3”

你能告诉我我做错了什么吗

更新 根据Thomas的评论,我决定使用PHP服务器端加密,而不是MySQL加密

经过半天的尝试,我终于找到了一个解决方案,我已经解决了这个问题:在服务器端用PHP加密字符串,在客户端用JavaScript使用提到的CryptoJS库解密字符串

以下是代码示例:

PHP 如何使用它 服务器端(PHP):

$sensitiveText = "Some sensitive information";
$encString = Encryption::encrypt($sensitiveText);
echo $encString;
var decrypted = decryptData('<?=$encString;?>');
客户端(JavaScript):

$sensitiveText = "Some sensitive information";
$encString = Encryption::encrypt($sensitiveText);
echo $encString;
var decrypted = decryptData('<?=$encString;?>');
var decrypted=解密数据(“”);
不要忘记加载适当的CryptoJS库:CBC&&ZeroPadding
这篇文章对我帮助很大:你也可以找到相反情况的信息。

你链接的MySQL文档提到MySQL中使用的加密模式是ECB,但你在解密代码中使用了CTR

你可能想换成欧洲央行

大,胖,警告:不要使用ECB ECB是一种非常不安全的加密模式,您不应该使用ECB加密任何敏感数据


考虑在服务器端代码中加密,而不是在MySQL中加密,以便使用更可靠的加密模式(为了简单起见,我建议使用CBC或CTR)。

谢谢Thomas。我尝试过ECB模式,但不幸的是它无法解密。MySQL支持更多不同类型的加密()但我不确定它们与客户端JS库的兼容程度。我将尝试一些PHP crypt服务器端加密-希望它们与客户端兼容。@BatBayan您混淆了算法和模式。例如,DES是一种不同的算法,而不是不同的模式。我指的是第一个库(Crypto JS)中的附加参数:CryptoJS.mode.CTR=>mode:CryptoJS.mode。ECB@BatBayan使用相同模式和相同填充函数的两个兼容的AES实现之间不应该存在任何兼容性问题:)我同意你的观点,理论上应该可以:)我会继续尝试。