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

标签 javascript mysql encryption

案例

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

这是一些示例:

MySQL选择语句:

SELECT HEX( AES_ENCRYPT( 'text', 'secret' ) )

结果:

CAC9877FC9203920EC4C0E8F1CB5C49C

对于客户端 AES JavaScript 解密实现,我尝试了以下库:Crypto-jsAES Advanced Encryption Standard

对于 Crypto-js,我遵循了 Mysql AES 加密参数(此处描述:http://bugs.mysql.com/bug.php?id=16713)与客户端解密参数相同,但它不起作用。

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

使用 Crypto-js 的示例代码:

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

结果:

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È”

Aes.Ctr.decrypt('CAC9877FC9203920EC4C0E8F1CB5C49C', 'secret', 128);

结果:“׽+) 3/4 %[ø\3”

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

更新

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

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

以下是代码示例:

PHP

<?php
class Encryption
{
     public function encrypt($text){
        $key = md5("secret");
        $iv = utf8_encode("1234567812345678");
        return mcrypt_encrypt(
            MCRYPT_RIJNDAEL_128, 
            $key, 
            $text, 
            MCRYPT_MODE_CBC, 
            $iv);
    }
}

JavaScript

function decryptData(text){
    var hash = CryptoJS.MD5('secret');
    var key = CryptoJS.enc.Utf8.parse(hash);
    var iv = CryptoJS.enc.Utf8.parse('1234567812345678');
    var dec = CryptoJS.AES.decrypt(
            text, 
            key, 
            {
                iv: iv, 
                mode: CryptoJS.mode.CBC, 
                padding: CryptoJS.pad.ZeroPadding 
            });
    return CryptoJS.enc.Utf8.stringify(dec);
}

如何使用

服务器端(PHP):

$sensitiveText = "Some sensitive information";
$encString = Encryption::encrypt($sensitiveText);
echo $encString;

客户端(JavaScript):

var decrypted = decryptData('<?=$encString;?>');

不要忘记加载适当的 CryptoJS 库:CBC && ZeroPadding 这篇文章对我帮助很大:http://lalengueta.blogspot.com/2013/07/test-criptografico-php-mcrypt-y.html 您也可以找到相反场景的信息。

最佳答案

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

您可能想切换到欧洲央行。

大、胖、警告:不要使用 ECB

ECB是一种非常不安全的加密模式,您不应该使用ECB来加密任何敏感数据。

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

关于javascript - Mysql AES_ENCRYPT => 客户端 JavaScript Aes.Ctr.decrypt 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18545713/

相关文章:

javascript - 我如何知道我的电脑是否连接了耳机? HTML5 + JavaScript

javascript - 混合 2 个数组的内容

javascript - 根据产品数量计算总计

php - 仅当字段的旧值与新值不匹配时才使用 CASE 语句更新 MySQL 记录?

MySQL 8 - 在 JSON_ARRAYAGG 中排序和过滤

java - 在java中验证C#中的rsa签名

php - 通知: No compatible server to client encryption algorithms found in

javascript - 使 switch 语句的一部分失败但不是全部失败?

c++ - 为什么 CryptImportKey 失败了?

php - 如何使用 SQL 选择查询获取特定数据?