2013-04-23 398 views
0

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

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. 使用固定的密钥,我注意到,如果我继续加密 相同的字符串我 做得到不同的结果,但只有结束部分加密 结果发生变化。看起来不正确。怎么来的?

非常感谢, 尼尔

+0

我的答案[这里](http://stackoverflow.com/a/8828196/589259)有一些帮助吗? – 2013-04-24 19:28:22

+0

对于主流加密目的,您不应该需要充气城堡。 Oracle JCA中的功能应该足够了。如果您确实需要额外的Bouncy功能,您可以简单地将您的应用程序编译为轻量级API,但安装Bouncy提供程序可能无法正常工作... – 2013-04-24 19:30:16

+0

感谢@owlstead,您引用的答案非常有用。我结束了去除盐,使用256位和标准JCA :) – 2013-04-30 11:11:29

回答

3

腌制一般的东西是散列密码时,没有明文进行加密时进行;例如,使用PBEKeySpec从密码生成密钥时,您将使用salt。 AES的“盐”是它的初始化向量。

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

1

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

盐通常用来散列密码,打败彩虹桌。 作品是这样的: 说用户输入密码“qwerty”。您生成一个长度为16字节的随机字符串(rs),将其添加到密码中,然后对结果字符串进行哈希处理,然后取出哈希值并添加rs - 并将结果字符串存储在数据库中。

+0

我现在明白了。感谢您的回答:) – 2013-04-30 11:13:01

+0

+1大概是正确的,因为循环的数量通常是可配置的,并且良好的PBKDF通常应该使用更接近MAC的东西而不是(仅)哈希。 – 2013-05-03 23:05:04

+0

你能详细介绍一下吗?我刚刚读了一下PBKDF,但是它与MAC有什么关系? – Evgeni 2013-05-04 00:46:00