【问题标题】:Salting with AES用 AES 腌制
【发布时间】:2013-04-23 21:41:16
【问题描述】:

我有点加密新手,但需要在存储到数据库之前加密敏感的个人数据。我打算将 AES 与 CBC 一起使用,但也想使用盐。但是,我找不到这样做的方法(除了 BouncyCastle,我的主机由于某种原因不准备允许)所以我决定自己添加一个,方法是在要加密的文本末尾添加一个随机字符串:

SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
IvParameterSpec ivspec = new IvParameterSpec(iv);

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivspec);

String plainText = "This is my plain text";
System.out.println("**plainText: " + plainText);

String saltedPlainText = plainText + UUID.randomUUID().toString().substring(0, 8);
byte[] encrypted = cipher.doFinal(saltedPlainText.getBytes());
String encryptedText = new String(new Hex().encode(encrypted));
System.out.println("**encryptedText: " + encryptedText);

cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivspec);

byte[] decrypted = cipher.doFinal(new Hex().decode(encryptedText.getBytes()));
saltedPlainText = new String(decrypted);
plainText = saltedPlainText.substring(0, saltedPlainText.length()-8);

System.out.println("**plainText: " + plainText);

我想我有 3 个问题:

  1. 有没有更好的方法在我的加密中包含盐?
  2. 在与此类似的示例中,似乎总是随机键 在开始时生成,解密后立即完成 加密。这是一个不太可能发生的情况 - 所以我一直在研究 基于我每次都应该使用相同的密钥(看起来像 不费吹灰之力,但我见过的所有例子似乎都是随机的)。看不到 它会如何工作,但有人可以确认:)
  3. 使用固定密钥,我注意到如果我继续加密 相同的字符串我 确实得到不同的结果,但只有加密的结尾部分 结果变化。似乎不对。怎么会?

非常感谢, 尼尔

【问题讨论】:

  • 我的回答 here 有帮助吗?
  • 您不应该将充气城堡用于主流加密目的。 Oracle JCA 中的功能应该足够了。如果您确实需要额外的 Bouncy 功能,您可以简单地使用您的应用程序编译轻量级 API,但安装 Bouncy 提供程序可能无法正常工作......
  • 感谢@owlstead,您引用的答案非常有帮助。我最终使用 256 位和标准 JCA 去除了盐 :)

标签: java encryption cryptography aes


【解决方案1】:

加盐通常是在对密码进行哈希处理时完成的,而不是在加密明文时完成的;例如,当使用PBEKeySpec 从密码生成密钥时,您将使用盐。 AES 的“盐”是它的初始化向量。

在加密相同的明文时会得到相同的密文,因为您每次都使用相同的初始化向量 - 您需要随机化 IV(使用例如SecureRandom),否则您需要从计数器生成 IV。 IV不是秘密的(可以明文传输),解密者需要使用与加密者相同的IV。

【讨论】:

    【解决方案2】:

    为什么要在文本中添加盐?它不会做任何事情。

    Salt 通常用于对密码进行哈希处理,以击败彩虹表。 像这样工作: 假设用户输入密码“qwerty”。您生成一个 16 字节长的随机字符串 (rs),将其添加到密码中,并对生成的字符串进行哈希处理,然后获取哈希值,将 rs 添加到其中 - 并将生成的字符串存储在数据库中。

    【讨论】:

    • 我现在明白了。谢谢你的回答:)
    • +1 表示大致正确,因为循环的数量通常是可配置的,并且好的 PBKDF 通常应该使用更接近 MAC 的东西而不是(仅)散列。
    • 你能详细说明一下吗?我刚刚阅读了一些关于 PBKDF 的内容,但它与 MAC 有什么关系?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多