嗯,这实际上是一个两部分...
首先我需要
- 读取文件的内容
- 将它们加密成一个
byte[]
- 将文件写入
byte[]
文件或其他...
然后#2 或#3 的结果将进入另一个项目。我正在尝试保护我们的 PEM/DER 密钥。
对于解密,我需要
- 读取加密文件的内容作为
byte[]
- 将它们解密为
byte[]
- 将解密的数据写入文件或使用它而不是文件
现在,我有一些基本的加密代码
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(128); // 192 and 256 bits may not be available
SecretKey secretKey = keyGenerator.generateKey();
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
// By initializing the cipher in CBC mode, an "initialization vector" has been randomly
// generated. This initialization vector will be necessary to decrypt the encrypted data.
// It is safe to store the initialization vector in plain text for later use. You can obtain
// it's bytes by calling iv.getIV().
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
IvParameterSpec iv = cipher.getParameters().getParameterSpec(IvParameterSpec.class);
// IvParameterSpec iv = new IvParameterSpec(IV); //used for the hardcoded one
byte[] encryptedData = cipher.doFinal(data);
并解密一个
cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
byte[] decryptedData = cipher.doFinal(encryptedData);
System.out.println("decrypted: " + new String(decryptedData));
问题是:
给定一个用例场景,其中一个人很少加密某些东西并且会分发要在运行时解密的加密密钥,除了密文之外,我还需要保存什么?
我知道我需要保存 IV,但是当我解密时不太好 - 这让我相信我也需要保存 secretKey。
谁能给我任何提示、指示或一般安全提示,以获得更好的解决方案?如果我需要保存密钥、IV 和加密数据,我应该将它们存储在哪里?也许硬编码密钥并将IV与加密数据一起存储?也许对 IV 和密钥都进行硬编码,并将加密数据存储在文件中?
这与理论上的安全无关,将其视为您可能对试图窃取您的钥匙的人造成的最大麻烦和不便。我们都知道我无法完美地隐藏它们。
我非常需要这个人从解密加密文件并在 Java 中执行开始的内容
但是,如果有更好的方法将安全数据输入 PemKeyReader,我会全力以赴。