AES Salting迭代,需要多少?

che*_*ish 0 encryption aes salt

我正在尝试执行一个简单的加密和解密AES,我试图使用salting.这些值将存储在DB中并从那里检索.(我不能使用哈希)我暂时使用静态密钥和静态盐.

我的问题是我应该多少次盐腌迭代?我的意思是我必须将值存储在数据库中,我看到在2次迭代(128位密钥,42位盐)我得到一个加密的字符串,包含152个字符,共40个字符.对于4次迭代,对于40个字符为364个字符,对于40个迭代,对于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;
    }
Run Code Online (Sandbox Code Playgroud)

Maa*_*wes 5

Salting用于密码以获得密钥.它不用于密文,即使它是64位编码.Salting用于使攻击者更难以使用蛮力或彩虹表找到密码.它通常由PBKDF使用,例如PBKDF2,bcrypt或scrypt.

在你的情况下,你加密多少并不重要; 如果攻击者尝试密钥,解密密文然后找到基础64,攻击者就会知道他找到了密钥,并且可以简单地再次进行迭代次数.

一般来说,多次加密是没有意义的; 分组密码本身已经包含足够数量的"轮次".