2016-07-13 168 views
0

我有一個存儲在字符串中的Xml。我需要使用會話密鑰(AES和256位)對其進行加密。使用會話密鑰加密Xml

我使用下面的代碼來生成密鑰:

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

會話密鑰是否私密,如果不存在安全問題。

您沒有指定加密模式,最好是明確的。

由於看起來沒有iv,並且沒有指定任何模式,所以假設是模式是ECB,它是不安全的,對於CBC模式,使用隨機iv進行加密數據預先使用解密。

另外缺少的是加密認證,密鑰生成較弱,最好使用派生函數,如PBKDF2。

不要使用ECB模式,這是不安全的,請參閱ECB mode,向下滾動到企鵝。

考慮使用一個更完整的庫如RNCryptor的JMCryptor包括PBKDF2密鑰導出加密認證,隨機IV和版本。另請參閱Specification for RNCryptor瞭解更多信息。

+0

感謝您的所有建議,我會將它們應用。但我也想知道,通過上面的代碼完成的加密是正確的還是不正確? – Mudit

+0

這取決於「正確與否」的含義?最佳實踐安全:No. – zaph

+0

我想用AES和PKCS7Padding的會話密鑰來加密XML,所以我想知道上述代碼的加密結果是否可以解密?現在我不關心安全問題 – Mudit