6

暗号化された情報をmysqlデータベース、エンジンmySamに保存するのに大きな問題があります

私はこのように情報を暗号化します:

function in($plaintext) {
 $cipher = 'rijndael-256';
 $mode = 'cbc';
 $key = 'key';

    $td = mcrypt_module_open($cipher, '', $mode, '');
    $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
    mcrypt_generic_init($td, $key, $iv);
    $crypttext = mcrypt_generic($td, $plaintext);
    mcrypt_generic_deinit($td);
    return $iv.$crypttext;
}

その後、データはBLOBに格納されます。情報を削除するようになると、データベースに保存されているために、約10%の確率で情報が破損しているように見えます。

スクリプトを実行してデータを問題なく大量に暗号化および復号化したので、データベースに問題があることを確認できます。

何か案は?前もって感謝します...

[復号化ルーチンの編集]

function decrypt($crypttext)
{   
 $cipher = 'rijndael-256';
 $mode = 'cbc';
 $key = '$key';

    $plaintext = ''; 
    $td        = mcrypt_module_open($cipher, '', $mode, '');
    $ivsize    = mcrypt_enc_get_iv_size($td);
    $iv        = substr($crypttext, 0, $ivsize);
    $crypttext = substr($crypttext, $ivsize);
    if ($iv)
    {   
        mcrypt_generic_init($td, $key, $iv);
        $plaintext = mdecrypt_generic($td, $crypttext);
    }   
    return $plaintext;
}
4

2 に答える 2

2

mysqlデータベースのバグに遭遇したことは非常に疑わしいです...どのように「破損」しましたか?復号化ルーチンとテストスクリプトを確認できますか?遭遇したのはブロックサイズのパディングだけではありませんか?

パディング:暗号化アルゴリズムは通常、データのブロック(128ビットを使用するaes)で機能します-入力(したがって出力!)データはこの長さにパディングされ、パディングされた出力文字列全体を保存する必要があります-おそらくあなたの長さは-パディングされた入力。入力データが、復号化後にパディングを自動的に決定および削除できないフォームの場合。

于 2012-05-16T17:34:48.243 に答える
0

MySQLでプレーンテキストのパスワードを保護することはお勧めできません...また、SHA1またはMD5ハッシュを使用しないのはなぜですか...より多くのconsice応答を取得し、適切と思われるアルゴリズムを変更します。

基本的に

SELECT SHA1( "SecretPassword")will = 08cd923367890009657eab812753379bdb321eeb or blabityboo

SHA1は40文字まで格納します。つまり、データ型をBLOBからvarchar、またはnvarchar()<---おそらくvarchar..に変更する必要があります。

アルゴリズムを構築しないと、フィールドの長さを知ることができないため、パディングについての注意が必要です。

SELECT CHARACTER_LENGTH( "SecretPassword")を使用してパスを選択すると、暗号化されたフィールドの長さが取得されます。次に、適切な制約を作成できます。

お役に立てれば。

于 2012-05-16T19:37:44.130 に答える