用AES腌制

时间:2013-04-23 21:41:17

标签: java encryption cryptography aes

我是一个加密新手,但需要在存储到数据库之前加密敏感的个人数据。我打算在CBC上使用AES,但也想用盐。然而,我无法找到一种方法来做到这一点(除了BouncyCastle,我的主机不准备出于某些原因)所以我决定通过在要加密的文本末尾添加一个随机字符串来添加一个:< / p>

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. 使用固定密钥,我注意到如果我继续加密 相同的字符串我     得到不同的结果,但只有加密的结束部分     结果变化。似乎不对。怎么样?
  4. 非常感谢, 尼尔

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

为什么要在文本中添加盐?它什么都不做。

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