我有一个存储在String中的Xml。我需要使用会话密钥(AES和256位)加密它。
我正在使用以下代码生成密钥:
public byte[] generateSessionKey() throws NoSuchAlgorithmException, NoSuchProviderException
{
KeyGenerator kgen = KeyGenerator.getInstance("AES","BC");
kgen.init(SYMMETRIC_KEY_SIZE);
SecretKey key = kgen.generateKey();
byte[] symmKey = key.getEncoded();
return symmKey;
}
使用以下代码使用会话密钥加密数据:
public byte[] encryptUsingSessionKey(byte[] skey, byte[] data) throws InvalidCipherTextException
{
PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new AESEngine(), new PKCS7Padding());
cipher.init(true, new KeyParameter(skey));
int outputSize = cipher.getOutputSize(data.length);
byte[] tempOP = new byte[outputSize];
int processLen = cipher.processBytes(data, 0, data.length, tempOP, 0);
int outputLen = cipher.doFinal(tempOP, processLen);
byte[] result = new byte[processLen + outputLen];
System.arraycopy(tempOP, 0, result, 0, result.length);
return result;
}
所以,我想知道,我这样做是对还是错?
答案 0 :(得分:0)
会话密钥是否为私有密码,如果不存在安全问题。
您没有指定加密模式,最好是明确的。
由于似乎没有iv并且没有指定模式,所以假设模式是ECB是不安全的,对于CBC模式更好,其中随机iv在加密数据之前用于解密期间使用
缺少加密认证,密钥生成较弱,最好使用PBKDF2等派生函数。
不要使用ECB模式,这是不安全的,请参阅ECB mode,向下滚动到企鹅。
考虑使用更完整的库,例如RNCryptor' JMCryptor,其中包括PBKDF2密钥派生,加密身份验证,随机iv和版本控制。有关详细信息,另请参阅Specification for RNCryptor。