【问题标题】:AES Salting iterations, How many required?AES Salting 迭代,需要多少次?
【发布时间】:2013-02-05 20:11:39
【问题描述】:

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

我的问题是我应该做多少次加盐迭代?我的意思是我必须将值存储在数据库中,我看到在 2 次迭代(128 位密钥,42 位盐)我得到一个 152 个字符的 40 个字符的加密字符串。 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;
    }

【问题讨论】:

  • 为什么不使用原始的byte[] 而不是每次迭代都转换为base64? base64 步骤可能是您的大部分痛苦。它应该在循环之外。
  • 请注意,除了给定的答案之外,您还会错误地使用 getBytes() 而不指定字符编码,使用 Sun 内部类 BASE64Encoder,可能使用 "AES" 这将导致ECB 模式加密,未指定 IV。我看不到 generateKey() 中的内容,但也许这是最好的。
  • 你为什么要这样做?什么,确切地你认为你正在实现?请仅以标准方式实现标准算法,不要编造任何东西。这是灾难的秘诀。

标签: encryption aes salt


【解决方案1】:

加盐用于密码以派生密钥。它不用于密文,即使它是基于 64 位编码的。加盐用于使攻击者更难使用蛮力或彩虹表找到密码。它通常由 PBKDF2、bcrypt 或 scrypt 等 PBKDF 使用。

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

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

【讨论】:

  • 所以你的意思是我可以放弃 base 64 编码和加盐,而应该只使用 AES 中的 o/p 进行存储?
  • 您只需要base64将密文存储为字符串(字符)。 AES 不需要加盐。也就是说,如前所述,您的实现似乎缺少其他被认为是安全的基本功能。
  • 你能给我一个链接,我可以理解这些东西吗?
  • 好吧,我刚刚完成了coursera.org/crypto 以了解更多有关基础理论的信息。就我个人而言,我只是阅读了规范,并且有一份工作需要我每天 6 小时享受加密货币和相关技术:)
  • 说“谢谢”的正确方式是赞成和/或接受,chettyharish :)
猜你喜欢
  • 1970-01-01
  • 2019-04-04
  • 2016-12-24
  • 2020-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-11
  • 2011-07-29
相关资源
最近更新 更多