PBKDF2WithHmacSHA512 Vs. PBKDF2WithHmacSHA1

2022-09-01 09:29:03

我正在开发一个Java身份验证子系统,该子系统将数据库中的密码存储指定为 - 生成的哈希值,现在我正在尝试决定是否应该使用或作为PRF。我浏览了两者的规格,但它们在数学上非常密集,让我可以遵循。具有更好的加密理解的人可以解释与?PBKDF2SHA1SHA512PBKDF2WithHmacSHA512PBKDF2WithHmacSHA1

以下是我正在尝试执行的操作:

private static final int HASH_BYTE_SIZE = 64 * 8; // 512 bits
private static final int PBKDF2_ITERATIONS = 1000;      

// generate random salt
SecureRandom random = new SecureRandom();
byte salt[] = new byte[SALT_BYTE_SIZE]; // use salt size at least as long as hash
random.nextBytes(salt);

// generate Hash
PBEKeySpec spec = new PBEKeySpec(password, salt, PBKDF2_ITERATIONS, HASH_BYTE_SIZE);
SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); // we would like this to be "PBKDF2WithHmacSHA512" instead? What Provider implements it?
byte[] hash = skf.generateSecret(spec).getEncoded();

// convert hash and salt to hex and store in DB as CHAR(64)...

答案 1

让我们逐个分解这个词:

PBKDF2--WithHmac--SHA512

让我们逐个部分地回顾一下

  • PBKDF2

    代表基于密码的密钥派生函数,PBKDF1 的后继函数,用于实现伪随机函数,例如加密哈希、密码或 HMAC 到输入密码或密码短语以及 salt 值,并多次重复该过程以生成派生密钥,然后可以在后续操作中将其用作加密密钥。

  • 断续器

    代表密钥哈希消息身份验证代码 (HMAC) 是用于计算消息身份验证代码 (MAC) 的特定构造,该代码涉及加密哈希函数与秘密加密密钥的组合。任何加密哈希函数,都可用于计算HMAC;由此产生的MAC算法相应地称为HMAC-MD5或HMAC-SHA1。

  • SHA512

    嗯,你知道的。:P

现在,回到你的问题,代码行:

SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");

指定键工厂以使用算法 。当你做这样的事情时:PDBKDF2WithHmacSHA1

SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA512");

你告诉工厂使用算法。PBDKF2WithHmacSHA512

本质上,和 之间的主要区别在于:PBKDF2WithHmacSHA1PBKDF2WithHmacSHA512

  1. 生成 160 位的哈希长度PBKDF2WithHmacSHA1
  2. 生成 512 位的哈希长度PBKDF2WithHmacSHA512

因此,后者更安全。但是双方都有争论,关于哪个足以加密。没有辩论。只是说。

有关这两种算法的一些其他信息:

  1. HMACSHA1

    HMACSHA1 是一种键控哈希算法,它从 SHA1 哈希函数构造,并用作 HMAC 或基于哈希的消息身份验证代码。HMAC 进程将密钥与消息数据混合,使用哈希函数对结果进行哈希处理,再次将该哈希值与密钥混合,然后再次应用哈希函数。输出哈希的长度为 160 位。

  2. HMACSHA512

    HMACSHA512 是一种键控哈希算法,它由 SHA-512 哈希函数构造,用作基于哈希的消息身份验证代码 (HMAC)。HMAC 进程将密钥与消息数据混合在一起,并对结果进行哈希处理。哈希值再次与密钥混合,然后再次进行哈希处理。输出哈希的长度为 512 位。

主要优点是比 更安全。例如:HmacWith512HmacWith256

HMAC_SHA1("key","The quick brown fox jumps over the lazy dog") = 0xde7c9b85b8b78aa6bc8a7a36f70a90701c9db4d9

HMAC_SHA512("key","The quick brown fox jumps over the lazy dog") = 0xb42af09057bac1e2d41708e48a902e09b5ff7f12ab428a4fe86653c73dd248fb82f948a549f7b791a5b41915ee4d1ec3935357e4e2317250d0372afa2ebeeb3a

差异非常大(如图所示)。希望它有帮助。:)

编辑:正如OP所提到的

PBEKeySpec(char[] password, byte[] salt, int iterationCount, int keyLength)

该参数用于指示可变密钥大小密码对密钥长度的首选项。实际密钥大小取决于每个提供程序的实现。因此,说,做这样的事情keyLength

PBEKeySpec(password, salt, int 100, 512)并不意味着您将使用 SHA1 生成密钥长度 512。它只是意味着。SHA1 最多支持 160 位。你不能超过这个。

至于你的第二个问题,看看HMAC-SHA1。有很多语句说,如果你的长哈希,像这样的算法是相当不错的。SHA256

此外,根据国家安全局:

NSA 指定“使用 FIPS-186-2 和 SHA-256 中指定的 256 位素模量椭圆曲线的椭圆曲线公钥加密适用于保护机密信息,直至机密级别。使用384位素模量椭圆曲线和SHA-384对于保护绝密信息是必要的。

我认为将HMAC函数与SHA512结合使用是相当安全的。


答案 2

SHA512 属于 SHA2 系列加密哈希函数。由于SHA1在理论上有弱点,并且SHA512比SHA1略慢(在散列密码时越慢越好),因此应选择SHA512(或任何SHA2系列)而不是SHA1以散列密码。

实际上,了解功能的差异并不简单,但是您可能有更好的机会在Crypto SE网站上获得答案。


推荐