验证加密要求我们使用一些公认的标准来加密和验证消息。因此,我们对消息进行加密并计算消息的 MAC 以验证它没有被篡改。
这个问题 https://stackoverflow.com/questions/992019/java-256-bit-aes-password-based-encryption概述了一种执行基于密码的密钥强化和加密的方法:
/* 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"));
但据我所知,这不会计算密文上的任何 MAC,因此是不安全的。在 Java 中执行身份验证加密的公认标准是什么?
我建议使用 GCM 模式加密。它默认包含在最新的 JDK (1.7) 中。它使用计数器模式加密(流密码,不需要填充)并添加身份验证标签。一个很大的优点是它只需要一个密钥,而 HMAC 添加了另一个密钥。 Bouncy Castle 也有一个实现,它与 Oracle 提供的实现大部分兼容。
GCM 模式加密也是 TLS RFC 和 XML 加密 1.1 中的功能(两者都不是最终版本)。 GCM 模式提供所有三个安全功能:发送数据的机密性、完整性和真实性。该字符串将是“AES/GCM/NoPadding”,而不是您现在部署的 CBC。如前所述,请确保您拥有 Oracle 提供的最新 JDK,或者安装了 Bouncy Castle 提供程序。
也可以看看我的回答here https://stackoverflow.com/questions/4551263/how-can-i-convert-string-to-secretkey,这主要是关于字符串编码,但我已经成功尝试了 GCM 模式 - 请参阅评论。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)