【发布时间】: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