代码之家  ›  专栏  ›  技术社区  ›  DTs

PBKDF2With HmacSHA512与PBKDF2WithHmacSHA1相比

  •  34
  • DTs  · 技术社区  · 12 年前

    我正在开发一个Java身份验证子系统,该子系统将数据库中的密码存储规范为 PBKDF2 -生成的哈希,我现在正试图决定是否应该使用 SHA1 SHA512 作为PRF。我仔细研究了两者的规格,但它们在数学上非常密集,我很难理解。有人能更好地理解加密货币吗 PBKDF2WithHmacSHA512 不同于 PBKDF2WithHmacSHA1 ?

    以下是我要做的:

    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)...
    
    2 回复  |  直到 5 年前
        1
  •  68
  •   Mark Rotteveel    8 年前

    让我们把这个词一个接一个地分解:

    PBKDF2--WithHmac--SHA512
    

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

    • PBKDF2

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

    • HMAC公司

      代表密钥散列消息认证码(HMAC)是一种用于计算消息认证码的特定结构,该消息认证码涉及密码散列函数和秘密密码密钥。可以在HMAC的计算中使用任何加密散列函数;所得到的MAC算法相应地被称为HMAC-MD5或HMAC-SHA1。

    • 沙512

      好吧,你知道的..:P

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

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

    指定要使用算法的keyFactory PDBKDF2WithHmacSHA1 。当你想做这样的事情时:

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

    你告诉工厂使用算法 PBDKF2WithHmacSHA512 .

    本质上 PBKDF2WithHmacSHA1 PBKDF2WithHmacSHA512 是不是:

    1. 这个 PBKDF2带HmacSHA1 生成160位的哈希长度 .
    2. 这个 PBKDF2带HmacSHA512 生成512位的哈希长度 .

    因此,后者更安全。但是,对于哪一个足以进行加密,双方都存在争论。没有辩论。只是说说而已。

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

    1. HMACSHA1型

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

    2. HMACSHA512

      HMACSHA512是一种密钥散列算法,由 SHA-512散列函数,并用作基于散列的消息 身份验证码(HMAC)。HMAC过程将密钥与 消息数据并对结果进行散列。哈希值与 再次输入密钥,然后进行第二次散列运算。输出哈希 长度为512位。

    主要优点是 HmacWith512 HmacWith256 。例如。

    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的keyLength。这只是意思。SHA1最多支持160位。你不能超过这个。

    至于你的第二个问题,看看 HMAC-SHA1 。有很多说法认为算法 SHA256 如果你是个大杂烩,那就很不错了。

    此外,根据NSA:

    美国国家安全局规定“使用 FIPS-186-2中指定的256位素模椭圆曲线 和SHA-256适用于保护机密信息 达到机密级别。384位素模椭圆曲线的使用 和SHA-384是保护绝密所必需的 信息

    我认为将HMAC功能与SHA512结合使用是非常安全的。

        2
  •  3
  •   Community CDub    8 年前

    SHA512属于加密散列函数的SHA2族。由于SHA1有理论上的弱点,并且SHA512比SHA1稍慢(对密码进行哈希处理时速度较慢越好),因此为了对密码进行散列处理,应该选择SHA512(或SHA2家族中的任何一个)而不是SHA1。

    事实上,理解函数中的差异并不简单,但您可能有更好的机会在 Crypto SE site .