首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PBKDF2WithHmacSHA512 Vs.PBKDF2WithHmacSHA1

PBKDF2WithHmacSHA512 Vs.PBKDF2WithHmacSHA1
EN

Stack Overflow用户
提问于 2013-10-14 02:09:20
回答 2查看 39.7K关注 0票数 30

我正在开发一个Java身份验证子系统,它将密码作为PBKDF2-generated散列存储在数据库中,现在我正在尝试决定应该使用SHA1还是SHA512作为PRF。我看过了这两个的规格,但它们对我来说是非常数学密集的。谁能更好地理解密码,解释一下PBKDF2WithHmacSHA512PBKDF2WithHmacSHA1的区别

这是我想要做的:

代码语言:javascript
复制
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)...
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-14 03:19:28

让我们将这个词逐个分解:

代码语言:javascript
复制
PBKDF2--WithHmac--SHA512

让我们一部分一部分地复习一下

代表基于口令的密钥派生函数,是PBKDF1的后继者,用于对输入的口令或口令短语以及盐值实现伪随机函数,例如加密散列、密码或HMAC,并重复该过程多次以产生派生密钥,该派生密钥随后可用作后续operations.

  • HMAC中的加密密钥

Keyed-Hash消息验证码(HMAC)是用于计算涉及加密散列函数和秘密密钥的消息验证码(MAC)的特定结构。任何密码散列函数都可以用于计算accordingly.

  • SHA512;由此得到的MAC算法被称为HMAC-MD5或HMAC-SHA1HMAC

好吧,你知道的..:P

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

代码语言:javascript
复制
SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");

指定要使用算法PDBKDF2WithHmacSHA1的keyFactory。当你要做一些事情的时候:

代码语言:javascript
复制
SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA512");

你告诉工厂使用PBDKF2WithHmacSHA512算法。

本质上,PBKDF2WithHmacSHA1PBKDF2WithHmacSHA512之间的主要区别是:

  1. PBKDF2WithHmacSHA1 将产生160 bits.
  2. The的哈希长度,will 将产生512 bits.

的哈希长度

因此,后者更安全。但是,对于哪种加密方式是足够的,双方都存在争议。没有争论。只是说说而已。

关于这两种算法的一些附加信息:

  1. HMACSHA1

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

  1. HMACSHA512

HMACSHA512是一种基于密钥的散列算法,它是根据SHA-512hash函数构造的,并用作基于散列的消息认证码。HMAC过程将密钥与消息数据混合,并对结果进行哈希处理。散列值再次与密钥混合,然后第二次进行散列。输出哈希的长度为512位。

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

代码语言:javascript
复制
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

差异是非常巨大的(如图所示)。希望能有所帮助。:)

编辑: As OP提及

代码语言:javascript
复制
PBEKeySpec(char[] password, byte[] salt, int iterationCount, int keyLength)

参数keyLength用于表示可变密钥大小密码对密钥长度的偏好。实际的密钥大小取决于每个提供程序的实现。因此,比如说,做一些像这样的事情

PBEKeySpec(password, salt, int 100, 512)并不意味着您将使用SHA1生成512的keyLength。简单地说就是。SHA1最大支持160位。你不能超过这个范围。

至于你的第二个问题,请看一下HMAC-SHA1。有很多声明说像SHA256这样的算法很好,如果你有很长的散列的话.

另外,根据国家安全局的说法:

-186-2和SHA-256中规定的使用256位素数模数椭圆曲线的椭圆曲线公钥密码算法适用于保密级别的机密信息保护。使用384位素数模数椭圆曲线和SHA-384是保护绝密信息所必需的。

我认为在SHA512中使用HMAC函数是非常安全的。

票数 61
EN

Stack Overflow用户

发布于 2013-10-14 03:13:16

SHA512属于加密散列函数的SHA2家族。由于SHA1在理论上存在缺陷,并且SHA512比SHA1稍慢(散列密码时速度越慢越好),因此,出于散列密码的目的,应该选择SHA512 (或任何SHA2系列)而不是SHA1。

实际上,理解函数之间的差异并不简单,但您可能有更好的机会在Crypto SE site上获得答案。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19348501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档