经过身份验证的加密要求我们使用一些可接受的标准来加密和验证消息.因此,我们都对消息进行加密并在消息上计算MAC以验证它是否未被篡改.
此问题概述了执行基于密码的密钥强化和加密的方法:
/* Derive the key, given password and salt. */
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec spec = new PBEKeySpec(password, salt, 65536, 256);
SecretKey tmp = factory.generateSecret(spec);
SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");
/* Encrypt the message. */
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secret);
AlgorithmParameters params = cipher.getParameters();
byte[] iv = params.getParameterSpec(IvParameterSpec.class).getIV();
byte[] ciphertext = cipher.doFinal("Hello, World!".getBytes("UTF-8"));
Run Code Online (Sandbox Code Playgroud)
但据我所知,这不会计算密文上的任何MAC,因此不安全.在Java中执行经过身份验证的加密的标准是什么?
Maa*_*wes 12
我建议使用GCM模式加密.它默认包含在最新的JDK(1.7)中.它使用计数器模式加密(流密码,不需要填充)并添加身份验证标记.一个很大的优点是它只需要一个密钥,而HMAC则为混合添加了另一个密钥.Bouncy Castle也有一个实现,它与Oracle提供的兼容.
GCM模式加密也是TLS RFC中的功能,也是XML加密1.1(两者都不是最终的).GCM模式提供所有三种安全功能:数据发送的机密性,完整性和真实性.字符串将是"AES/GCM/NoPadding"而不是您正在部署的CBC.如上所述,请确保您拥有Oracle的最新JDK,或安装了Bouncy Castle提供程序.
另外在这里查看我的答案,主要是关于字符串编码,但我也成功地尝试了GCM模式 - 请参阅评论.