如何在Java中使用SHA-512散列密码?

sta*_*man 31 java security passwords hash sha512

我一直在研究Java String加密技术,遗憾的是我还没有找到任何关于如何在Java中使用SHA-512散列String的好教程.我读了一些关于MD5和Base64的博客,但它们并不像我想的那样安全(实际上,Base64不是加密技术),所以我更喜欢SHA-512.

A. *_*nha 62

您可以将它用于SHA-512

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public String get_SHA_512_SecurePassword(String passwordToHash, String salt){
    String generatedPassword = null;
    try {
        MessageDigest md = MessageDigest.getInstance("SHA-512");
        md.update(salt.getBytes(StandardCharsets.UTF_8));
        byte[] bytes = md.digest(passwordToHash.getBytes(StandardCharsets.UTF_8));
        StringBuilder sb = new StringBuilder();
        for(int i=0; i< bytes.length ;i++){
            sb.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1));
        }
        generatedPassword = sb.toString();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    return generatedPassword;
}
Run Code Online (Sandbox Code Playgroud)

  • @stackpepe - 这不应该用于哈希密码,SHA* - 家庭太快,太容易暴力破解.有了良好的GPU,您可以计算出[每秒4千兆SHA512](http://hashcat.net/oclhashcat/#performance),这就是为什么要切换到BCrypt,PBKDF2或SCrypt. (9认同)
  • @Abhi - 一个盐可以防止攻击者可以构建一个彩虹表来一次获取所有密码,而不是为每个盐构建一个彩虹表,这使得攻击变得不可行.尽管如此,盐对暴力强制(通常是字典攻击)只能提供单一密码.如果强制整个英语词典只需要几分之一毫秒,那么我们需要一个具有成本因子的算法,该算法定义了计算单个散列所需的时间(BCrypt,PBKDF2,SCrypt). (4认同)
  • 除了Salt输入为UTF-8字符串(虽然它通常以字节定义),不检查长度,异常处理没有很好地定义(到代码不编译的程度),十六进制例程很难阅读并包含在方法中,不遵守Java命名约定,不良编码实践首先在不需要时分配null ...只是一个关于如何使用SHA-512的糟糕演示.我想upvotes的主要原因是这个问题首先出现在谷歌的"SHA-512 Java"搜索词中. (4认同)
  • @MaartenBodewes人们需要付出一些努力来获得更好的输出.我提供的代码不是用于复制粘贴,而只是一个可以根据需要进行改进的提示. (2认同)
  • @Abhi:但这正是人们会做的:复制和粘贴。 (2认同)

The*_*ini 24

请停止使用哈希函数对密码进行编码!它们无法提供您所需的保护.相反,您应该使用像PBKDF2,bcrypt或scrypt这样的算法.

参考文献:

  • 我支持你的答案,但通常这些算法也称为哈希函数(PBKDF甚至使用SHA).解释加密和散列之间的区别很困难,因此不使用散列函数的建议可能有点令人困惑.缓慢是有区别的. (9认同)
  • @MaartenBodewes - 也许适当算法的最佳表达方式是**密码散列函数**.我的意思是,当我们说:不使用哈希函数,使用密码哈希函数时,这听起来很混乱.如果我们这样做,我们应该解释是什么产生了差异,在这种情况下,重点是"成本因素",或者更一般地说,我们可以控制计算哈希的必要时间. (2认同)

TOU*_*del 6

使用番石榴

Hashing.sha512().hashString(s, StandardCharsets.UTF_8).toString()
Run Code Online (Sandbox Code Playgroud)

  • 顺便说一句,这仍处于测试阶段 (2认同)