java - 加密或散列
问题描述
我在网上有一个功能说这是 AES-256 位加密:
public static String encrypt(String strToEncrypt, String secret)
{
try
{
byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
IvParameterSpec ivspec = new IvParameterSpec(iv);
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
KeySpec spec = new PBEKeySpec(secretKey.toCharArray(), salt.getBytes(), 65536, 256);
SecretKey tmp = factory.generateSecret(spec);
SecretKeySpec secretKey = new SecretKeySpec(tmp.getEncoded(), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivspec);
return Base64.getEncoder().encodeToString(cipher.doFinal(strToEncrypt.getBytes("UTF-8")));
}
catch (Exception e)
{
System.out.println("Error while encrypting: " + e.toString());
}
return null;
}
现在,这是使用 HMAC-SHA256。那么这实际上是 AES 还是散列?还是仅使用 HMAC 散列密钥?我的意思是 SHA-256 是一种散列算法?此外,这听起来可能很基本,但 HMAC 是散列/加密吗?
解决方案
这是使用PKBDF2将密码延伸到密钥中。然后它使用该密钥在 CBC 模式下使用 AES 加密数据。
PBKDF2 需要一个伪随机函数(PRF),这里使用的 PRF 是HMAC。HMAC 需要一个压缩(散列)函数,该函数是SHA-2,具有 256 位摘要大小(通常称为“SHA-256”)。
我不会说“这是 AES-256 位加密”。这是一个完整的加密系统,包括 AES-256 作为其组件之一。还有许多其他(并且更安全)的方法可以使用 AES 加密事物。例如,这似乎有一个静态 IV+Key(假设salt
和secret
是恒定的)。这是使用 CBC 模式的不安全方式。它还缺乏任何类型的身份验证,因此消息可能会在传输过程中被修改。这类缺陷很常见,但这不应被视为 AES-256 的典型示例。
推荐阅读
- python - 对 django CORS 问题做出反应
- swift - 从超类本身调用重写的方法
- vps - 微信小程序可以使用阿里云VPS服务器吗?
- javascript - if else 在 JavaScript 中同时打印
- elasticsearch - 如何在弹性搜索中的对象数组上应用过滤器组合?
- gcc - 带有 -mtune 标志的交叉编译器和本机编译器有什么区别?
- javascript - 当我使用以下代码测试用例失败时,我无法开玩笑地模拟 @react-navigation/drawer
- kotlin-multiplatform - 我应该将我的包名用于 KMM SqlDelight 配置吗?
- javascript - 无法获得输出
- c++ - Windows 11 的 IsWindowsVersionOrGreater 参数