ケース
MySQL DB に機密データがあり、SELECT ステートメントを実行するときに暗号化したいと考えています。次に、クライアント側で JavaScript を使用して復号化します。
次に例を示します。
MySQL 選択ステートメント:
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 ) に従って、クライアント側の復号化パラメーターと等しくなりますが、機能しません。 .
2番目のライブラリでも機能しないようです。
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
Advanced Encryption Standard ライブラリを使用したクライアント側の復号化の実装例:
Aes.Ctr.decrypt(window.atob('CAC9877FC9203920EC4C0E8F1CB5C49C'), 'secret', 128);
結果:"40^¡®bÞøgÈ"
Aes.Ctr.decrypt('CAC9877FC9203920EC4C0E8F1CB5C49C', 'secret', 128);
結果:"ӽ+) ¾ %[ø\3 "
私が間違っていることを教えてください。
アップデート
Thomas のコメントによると、MySQL 暗号化の代わりに PHP サーバー側暗号化を有効にすることにしました。
半日試行した後、最終的に私は解決策を見つけることができました.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反対のシナリオも。