Encryption AES盐析迭代,需要多少次?

Encryption AES盐析迭代,需要多少次?,encryption,aes,salt,Encryption,Aes,Salt,我正在尝试执行一个简单的加密和解密AES,我正在尝试使用salting。这些值将存储在数据库中并从中检索。(我不能使用散列)我目前正在使用静态键和静态盐 我的问题是我应该做多少次盐析?我的意思是,我必须将值存储在DB中,我看到在2次迭代(128位密钥,42位salt)时,我得到了一个加密字符串,其中152个字符对应40个字符。对于4次迭代,它是364个字符对应40个字符,对于8次迭代,1536个字符对应40个字符,对于16次迭代,荒谬的19968个字符对应40个字符 那么,我的最佳迭代次数应该是

我正在尝试执行一个简单的加密和解密AES,我正在尝试使用salting。这些值将存储在数据库中并从中检索。(我不能使用散列)我目前正在使用静态键和静态盐

我的问题是我应该做多少次盐析?我的意思是,我必须将值存储在DB中,我看到在2次迭代(128位密钥,42位salt)时,我得到了一个加密字符串,其中152个字符对应40个字符。对于4次迭代,它是364个字符对应40个字符,对于8次迭代,1536个字符对应40个字符,对于16次迭代,荒谬的19968个字符对应40个字符

那么,我的最佳迭代次数应该是多少

 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;
    }
公共静态字符串AESencrypt(字符串值)引发异常{
Key=generateKey();
Cipher c=Cipher.getInstance(算法);
c、 init(Cipher.ENCRYPT_模式,密钥);
字符串valueToEnc=null;
字符串eValue=值;
对于(int i=0;i
在密码上使用盐分来派生密钥。它不用于密文,即使它是base 64编码的。Salting用于使攻击者更难使用暴力或rainbow表找到密码。它通常由PBKDF(如PBKDF2、bcrypt或scrypt)使用

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


一般来说,多次加密是没有意义的;块密码本身应该包含足够数量的“轮数”。

对密码使用盐析来派生密钥。它不用于密文,即使它是base 64编码的。Salting用于使攻击者更难使用暴力或rainbow表找到密码。它通常由PBKDF(如PBKDF2、bcrypt或scrypt)使用

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


一般来说,多次加密是没有意义的;块密码本身应该包含足够数量的“轮数”。

为什么不使用原始
字节[]
而不是每次迭代都转换为base64?base64步骤可能是您的主要痛苦。它应该在循环之外。请注意,除了给定的答案外,使用Sun内部类
BASE64Encoder
,可能使用将导致ECB模式加密的
“AES”
,而不指定字符编码,也会犯错误,未指定IV。我看不到
generateKey()
中的内容,但这可能是最好的。为什么要这样做?你认为你到底取得了什么成就?请仅以标准方式实现标准算法,不要编造东西。这会导致灾难。为什么不使用原始的
字节[]
,而不是每次迭代都转换为base64?base64步骤可能是您的主要痛苦。它应该在循环之外。请注意,除了给定的答案外,使用Sun内部类
BASE64Encoder
,可能使用将导致ECB模式加密的
“AES”
,而不指定字符编码,也会犯错误,未指定IV。我看不到
generateKey()
中的内容,但这可能是最好的。为什么要这样做?你认为你到底取得了什么成就?请仅以标准方式实现标准算法,不要编造东西。这是一个灾难的配方。所以你的意思是我可以放弃base64编码和salting,应该只使用AES中的o/p来存储?你只需要base64就可以将密文存储为字符串(字符)。AES不需要加盐。也就是说,正如所指出的,您的实现似乎缺少了其他被认为是安全的基本功能。您能给我一个链接,让我能够理解这些东西吗?嗯,我刚刚完成了对基本理论的进一步了解。就我个人而言,我只是阅读了说明书,有一份工作要求我每天6小时享受加密和相关技术:)说“谢谢”的正确方式是向上投票和/或接受,chettyharish:)那么你的意思是我可以放弃base64编码和salting,应该只使用AES中的o/p进行存储?你只需要base64就可以将密文存储为字符串(字符)。AES不需要加盐。也就是说,正如所指出的,您的实现似乎缺少了其他被认为是安全的基本功能。您能给我一个链接,让我能够理解这些东西吗?嗯,我刚刚完成了对基本理论的进一步了解。就我个人而言,我只是阅读规范,有一份工作要求我每天6小时享受加密和相关技术:)正确的说法是“比”