gpt4 book ai didi

java - 在 Java 中执行经过身份验证的加密的正确方法是什么?

转载 作者:搜寻专家 更新时间:2023-10-30 21:25:06 25 4
gpt4 key购买 nike

经过身份验证的加密要求我们使用一些公认的标准来加密和验证消息。因此我们既加密消息又计算消息的 MAC 以验证它没有被篡改。

This question概述了一种执行基于密码的 key 强化和加密的方法:

/* 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) 中。它使用计数器模式加密(流密码,不需要填充)并添加身份验证标签。一个很大的优势是它只需要一个 key ,而 HMAC 会添加另一个 key 。 Bouncy CaSTLe 也有一个实现,它与 Oracle 提供的实现大部分兼容。

GCM 模式加密也是 TLS RFC 和 XML encrypt 1.1(都不是最终版)中的功能。 GCM 模式提供所有三种安全特性:数据发送的 secret 性、完整性和真实性。该字符串将是“AES/GCM/NoPadding”,而不是您现在部署的 CBC。如前所述,请确保您拥有来自 Oracle 的最新 JDK,或者安装了 Bouncy CaSTLe 提供程序。

另请查看我的回答 here ,主要是关于字符串编码,但我也成功尝试了 GCM 模式 - 请参阅评论。

关于java - 在 Java 中执行经过身份验证的加密的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9570816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com