0

単純な暗号化および復号化 AES を実行しようとしていますが、ソルティングを使用しようとしていました。これらの値は DB に格納され、そこから取得されます。(ハッシュは使えません) とりあえず静的キーと静的ソルトを使っています。

私の質問は、塩漬けを何回繰り返せばよいですか? つまり、DB に値を保存する必要があり、2 回の反復 (128 ビット キー、42 ビット ソルト) で、40 文字に対して 152 文字の暗号化された文字列が得られることがわかります。4 回の反復では 40 文字で 364 文字、8 回の反復では 40 文字で 1536 文字、16 回の反復では 40 文字で 19968 文字という馬鹿げた数字です。

では、最適な反復回数はいくつになるでしょうか?

 public static String AESencrypt(String value) throws Exception {
        Key key = generateKey();
        Cipher c = Cipher.getInstance(ALGORITHM);
        c.init(Cipher.ENCRYPT_MODE, key);

        String valueToEnc = null;
        String eValue = value;
        for (int i = 0; i < ITERATIONS; i++) {
            valueToEnc = salt + eValue;
            byte[] encValue = c.doFinal(valueToEnc.getBytes());
            eValue = new BASE64Encoder().encode(encValue);
        }
        return eValue;
    }

    public static String AESdecrypt(String value) throws Exception {
        Key key = generateKey();
        Cipher c = Cipher.getInstance(ALGORITHM);
        c.init(Cipher.DECRYPT_MODE, key);

        String dValue = null;
        String valueToDecrypt = value;
        for (int i = 0; i < ITERATIONS; i++) {
            byte[] decordedValue = new BASE64Decoder().decodeBuffer(valueToDecrypt);
            byte[] decValue = c.doFinal(decordedValue);
            dValue = new String(decValue).substring(salt.length());
            valueToDecrypt = dValue;
        }
        return dValue;
    }
4

1 に答える 1

6

ソルティングは、キーを取得するためにパスワードに使用されます。Base 64でエンコードされている場合でも、暗号文では使用されません。ソルトは、攻撃者がブルートフォースまたはレインボーテーブルを使用してパスワードを見つけにくくするために使用されます。これは通常、PBKDF2、bcrypt、scryptなどのPBKDFによって使用されます。

あなたの場合、どれだけ暗号化するかは問題ではありません。攻撃者がキーを試し、暗号文を復号化してからbase 64を見つけた場合、攻撃者はキーを見つけたことを認識し、単純に繰り返し回数を繰り返すことができます。

一般に、物事を複数回暗号化することは意味がありません。ブロック暗号自体には、すでに十分な数の「ラウンド」が含まれている必要があります。

于 2013-02-20T20:35:18.097 に答える