如何仅使用密码加密 Java 中的字符串?

How to encrypt a string in Java by just using a password?

我正在开发一个应用程序,我需要使用用户输入的密码(作为密钥)加密文本并存储它。用户可以随时通过输入密码来解密他的数据。数据的安全性应取决于密码的复杂性和长度。

我以前使用过 AES,但在这里我不能使用它,因为 AES 中的加密密钥必须具有特定长度。我想要加密密钥可以是任意长度的东西。

我就是想不出要使用哪种加密方法或算法。

搜索 PBKDF - 基于密码的密钥派生函数。请注意 - 密码不是密钥(密码具有不同的长度并且通常熵较小)。

尽管您可以从密码中导出密钥。目前常用的基于密码的密钥派生函数是 PBKDF2、Argon2、BCrypt 或 SCrypt。只需搜索它们即可。

你可以检查一些examples

IvParameterSpec ivParamSpec = new IvParameterSpec(iv);

PBEParameterSpec pbeParamSpec = new PBEParameterSpec(psswdSalt, PBKDF_INTERATIONS, ivParamSpec);
PBEKeySpec pbeKeySpec = new PBEKeySpec(password.toCharArray());
SecretKeyFactory pbeKeyFactory = 
SecretKeyFactory.getInstance("PBEWithHmacSHA256AndAES_128");
SecretKey pbeKey = pbeKeyFactory.generateSecret(pbeKeySpec);

Cipher cipher = Cipher.getInstance(PBE_CIPHER_NAME);
cipher.init(Cipher.ENCRYPT_MODE, pbeKey, pbeParamSpec);

理论上 - 您可以使用简单的散列(例如 sha-256)并仅采用必要的位数来派生密钥。问题在于,如果人们容易记住密码,那么密码通常不会那么随机;这意味着它们容易受到暴力攻击或字典攻击。