gpt4 book ai didi

java - 仅根据密码生成 AES key

转载 作者:行者123 更新时间:2023-12-02 12:37:04 25 4
gpt4 key购买 nike

我有一个应用程序可能需要密码进行身份验证。
该应用程序不处理任何敏感数据,因为该“密码”是由主机选择并通过另一个 channel (WhatsApp 或其他 channel )告知“客户”。因此,当客户端想要进行身份验证时,主机会生成一个随机字符串发送给客户端。
然后,客户端使用用户输入的密码加密该随机字符串。
加密的随机字符串被发送回主机。
主机使用相同密码生成的 key 解密此加密字符串。
如果未加密的字符串与原始字符串匹配,则用户已登录。
这是我到目前为止想到的:

String base64;
char[] password = "password".toCharArray();
String randomString = new BigInteger(130, new SecureRandom()).toString(32);
try {
//Encrypt Client Side
SecretKey key = new SecretKeySpec(SecretKeyFactory.getInstance("PBKDF2WithHmacSHA512").generateSecret(new PBEKeySpec(password)).getEncoded(), "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, key);
base64 = Base64.getEncoder().encodeToString(cipher.doFinal(randomString.getBytes(StandardCharsets.UTF_8)));
} catch (GeneralSecurityException e) {
throw new IllegalStateException(e);
}
try {
//Decrypt Server Side
SecretKey key = new SecretKeySpec(SecretKeyFactory.getInstance("PBKDF2WithHmacSHA512").generateSecret(new PBEKeySpec(password)).getEncoded(), "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, key);
//Check if both strings match
System.out.println(Arrays.equals(cipher.doFinal(Base64.getDecoder().decode(base64)), randomString.getBytes(StandardCharsets.UTF_8)));
} catch (GeneralSecurityException e) {
throw new IllegalStateException(e);
}

不幸的是,此代码抛出异常:java.security.spec.InvalidKeySpecException:未找到 Salt
我应该使用不同的算法,还是应该通过散列密码本身生成盐,或者完全不同的方法?我想避免必须将生成的盐与随机字符串一起发送

最佳答案

您应该为 PBEKeySpec 提供为 AES key 生成足够位所需的内容。两面都需要相同的盐,所以你可以这样做:

 byte[] salt = new byte[8];
System.arraycopy(randomString.getBytes("UTF-8"), 0, salt, 0, 8);

现在将您的 PBEKeySpec 替换为 new PBEKeySpec(password, salt, 10, 128),一切都应该可以正常工作。

关于java - 仅根据密码生成 AES key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45103983/

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