【问题标题】:How to encrypt a string in Java by just using a password? [duplicate]如何仅使用密码在 Java 中加密字符串? [复制]
【发布时间】:2020-07-02 07:43:28
【问题描述】:

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

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

我只是不知道要使用哪种加密方法或算法。

【问题讨论】:

  • 它是一种“常见(好!)做法”:不使用“用户密码”(作为“密钥”),而是使用(标准长度散列函数 其中...(符合您的密钥长度要求)!
  • 用密码创建一个 zip 文件对您来说是一个好的解决方案吗?如果是这样,请尝试:npmjs.com/package/minizip-asm.js

标签: java string encryption password-hash


【解决方案1】:

搜索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)并只使用必要的位数来导出密钥。问题是,如果人类容易记住,密码通常不会那么随机。这意味着它们很容易受到暴力攻击或字典攻击。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-17
    • 2010-12-11
    • 2023-01-12
    • 2014-06-26
    • 1970-01-01
    • 2019-06-28
    • 2019-12-15
    • 1970-01-01
    相关资源
    最近更新 更多