案例
我在MySQL DB中有一些敏感数据,我想在执行SELECT语句时对其进行加密。然后我想用JavaScript在客户端解密它。
以下是一些例子:
MySQL select语句:
SELECT HEX( AES_ENCRYPT( 'text', 'secret' ) )
结果:
CAC9877FC9203920EC4C0E8F1CB5C49C
对于客户端AES JavaScript解密实现,我尝试了以下库:Crypto-js和AES 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 "
你能告诉我我做错了吗?
根据Thomas的评论,我决定开启PHP服务器端加密而不是MySQL加密。
经过半天的尝试,我终于找到了解决方案,我已经开始工作了:用PHP加密服务器端的字符串,并使用上面提到的CryptoJS库在客户端解密它。
以下是代码示例:
<?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);
}
}
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&amp;&amp; ZeroPadding 这篇文章对我有很大的帮助:http://lalengueta.blogspot.com/2013/07/test-criptografico-php-mcrypt-y.html你也可以找到相反情况的信息。
答案 0 :(得分:1)
您链接的MySQL文档提到MySQL中使用的加密模式是ECB,但是,您在解密代码中使用了CTR。
您可能想切换到ECB。
ECB是一种非常不安全的加密模式,您不应使用ECB加密任何敏感数据。
考虑在服务器端代码中加密,而不是在MySQL中加密,以便使用更可靠的加密模式(为简单起见,我建议使用CBC或CTR)。