java - 使用 PBKDF2WithHmacSHA512 的密码保护在生产设置 (AWS) 上花费了大量的处理时间

标签 java password-encryption aws-sdk

我正在尝试使用以下步骤安全地存储我的用户密码

  1. 使用 PBKDF2WithHmacSHA512 进行加盐+散列+拉伸(stretch)
  2. 迭代 20,000 次

我的代码粘贴在下面

public class EncrypterClass
{
    private static final int iterations = 20000;
    private static final int saltLen = 64;
    private static final int desiredKeyLen = 512;

    private static String hash(String value, byte[] salt) throws Exception 
    {
        if (value == null || value.length() == 0)
            throw new IllegalArgumentException("Empty passwords are not supported.");
        SecretKeyFactory f = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
        SecretKey key = f.generateSecret(new PBEKeySpec(value.toCharArray(), salt, iterations, desiredKeyLen));
        return Base64.encodeBase64String(key.getEncoded());
    }

    public static class Password
    {
        public static String getSaltedPassword( String password ) throws Exception 
        {
            byte[] salt = SecureRandom.getInstance("SHA1PRNG").generateSeed(saltLen);        
            return Base64.encodeBase64String(salt) + "$" + hash(password, salt);
        }

        public static boolean match(String password, String saltedPassword) throws Exception
        {
            String[] saltAndPass = saltedPassword.split("\\$");
            if (saltAndPass.length != 2) 
            {
                return false;
            }
            String hashOfInput = hash(password, Base64.decodeBase64(saltAndPass[0]));
            return hashOfInput.equals(saltAndPass[1]);
        }
    } 
}

当我在本地计算机上测试它时,它工作正常。但在我的 AWS 设置流程中,需要进行某种耗时的处理(需要几分钟来对密码进行哈希处理)。目前,我的 AWS 设置是免费测试设置,具有以下资源:具有 1 个 vCPU 和 1GiB 的 EC2 t2.micro

有人可以指导一下可能出现的问题吗?

谢谢 阿米特

最佳答案

这种盐 + 哈希算法,尤其是在迭代次数如此多的情况下,其设计速度很慢,而且是故意的:其目标正是使攻击者通过暴力攻击找到密码的计算难度变得非常大。在资源有限的虚拟机上,显然会更慢。

关于java - 使用 PBKDF2WithHmacSHA512 的密码保护在生产设置 (AWS) 上花费了大量的处理时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31491245/

相关文章:

node.js - TypeError : AWS. SecretsManager 不是使用 proxyquire 进行单元测试的构造函数

java - 如何将复杂的 Java 对象写入 CSV 文件

java - php 和 java 对象的通用序列化器

java - 如何在 eclipse rcp 中编辑 workbench.xml 特定节点的值

encryption - 使用 Talend Data Integration 对 .properties 文件中的密码进行加密/加密和解密

node.js - AWS Lambda 直接调用发送两个立即响应

javascript - aws-sdk Promise 中未返回任何数据

java - 格式化字符串的最快和最有效的方法

linux - ecryptfs - passwd 实用程序如何更新非管理员密码更改的哈希值?

php - 数据库上的安全明文密码