我是一个加密新手,但需要在存储到数据库之前加密敏感的个人数据。我打算将 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个问题:
- 有没有更好的方法在我的加密中包含盐?
- 在与此类似的示例中,似乎总是在开始时生成随机密钥,并且在加密后立即进行解密。这是一个不太可能发生的情况 - 所以我一直在每次都应该使用相同的密钥的基础上工作(看起来很简单,但我看到的所有示例似乎都是随机的)。看不到它还能如何工作,但有人可以确认:)
- 使用固定密钥时,我注意到如果我继续加密相同的字符串,我会得到不同的结果,但只有加密结果的结尾部分会发生变化。似乎不对。怎么来的?
非常感谢,尼尔