0

ケース

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反対のシナリオも。

4

1 に答える 1

1

リンクした MySQL ドキュメントには、MySQL で使用されている暗号化モードは ECB であると記載されていますが、復号化コードで CTR を使用しています。

ECB に切り替えることをお勧めします。

ビッグ、ファット、警告: ECB を使用しないでください

ECB は非常に危険な暗号化モードです。ECB を使用して機密データを暗号化しないでください。

より信頼性の高い暗号化モードを使用するために、MySQL ではなくサーバー側のコードで暗号化することを検討してください (簡単にするために、CBC または CTR をお勧めします)。

于 2013-08-31T14:26:02.810 に答える