gpt4 book ai didi

java - 使用 AES 加盐

转载 作者:行者123 更新时间:2023-12-01 18:50:02 63 4
gpt4 key购买 nike

我是一个加密新手,但需要在存储到数据库之前对敏感的个人数据进行加密。我计划将 AES 与 CBC 结合使用,但也想使用盐。然而,我找不到一种方法来做到这一点(除了 BouncyCaSTLe,我的主机由于某种原因不准备允许),所以我决定通过在要加密的文本末尾添加一个随机字符串来自己添加一个:

SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
IvParameterSpec ivspec = new IvParameterSpec(iv);

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivspec);

String plainText = "This is my plain text";
System.out.println("**plainText: " + plainText);

String saltedPlainText = plainText + UUID.randomUUID().toString().substring(0, 8);
byte[] encrypted = cipher.doFinal(saltedPlainText.getBytes());
String encryptedText = new String(new Hex().encode(encrypted));
System.out.println("**encryptedText: " + encryptedText);

cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivspec);

byte[] decrypted = cipher.doFinal(new Hex().decode(encryptedText.getBytes()));
saltedPlainText = new String(decrypted);
plainText = saltedPlainText.substring(0, saltedPlainText.length()-8);

System.out.println("**plainText: " + plainText);

我想我有 3 个问题:

  1. 是否有更好的方法在加密中包含盐?
  2. 在与此类似的示例中,似乎总是随 secret 钥在开始时生成,解密后立即完成 加密。这是一种不太可能发生的情况 - 所以我已经研究了 我应该每次都使用相同的 key (看起来像 理所当然,但我见过的所有例子似乎都是随机的)。看不到 否则它会如何工作,但有人可以确认:)
  3. 使用固定 key 时,我注意到如果我继续加密相同的字符串我 确实得到了不同的结果,但只有加密的结尾部分 结果改变。似乎不对。怎么会这样?

非常感谢,尼尔

最佳答案

加盐通常是在散列密码时完成的,而不是在加密明文时完成的;例如,当使用 PBEKeySpec 从密码生成 key 时,您可以使用盐。 。 AES 的“盐”是它的初始化 vector 。

在加密相同的明文时,您会得到相同的密文,因为您每次都使用相同的初始化 vector - 您需要随机化 IV(例如使用 SecureRandom ),否则您需要从计数器生成 IV。 IV不是 secret 的(可以明文传输),解密者需要使用与加密者相同的IV。

关于java - 使用 AES 加盐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16179657/

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