java中的SHA2密码哈希

我正在尝试使用SHA2散列一些密码。

我在哪里可以获得一段Java代码?

我看过那篇文章,但我遗漏了一些东西: 用Java编写SHA2密码

Mac mac = Mac.getInstance("HmacSha256"); SecretKeySpec secret = new SecretKeySpec(key.getBytes(), "HmacSha256"); mac.init(secret); byte[] shaDigest = mac.doFinal(phrase.getBytes()); String hash = ""; for(byte b:shaDigest) { hash += String.format("%02x",b); } 

这句话是我想编码的字符串吗? 什么是关键(第2行)

提前致谢

首先,你需要清楚你想做什么。 您说要散列密码,但您使用的代码是MAC( 消息validation码 ),特别是HMAC 。

哈希和MAC对于不同的目的是不同的东西(虽然HMAC确实涉及使用哈希)。 您需要确保使用正确的产品满足您的要求。

您被要求提供密钥的原因是因为MAC需要密钥。 哈希没有:

 public byte[] hash(String password) throws NoSuchAlgorithmException { MessageDigest sha256 = MessageDigest.getInstance("SHA-256"); byte[] passBytes = password.getBytes(); byte[] passHash = sha256.digest(passBytes); return passHash; } 

我修改了一个小rossum的代码,添加了salt并将返回类型转换为String,添加了try / catch,也许它会对某人有所帮助:

  public String hash(String password) { try { MessageDigest sha256 = MessageDigest.getInstance("SHA-256"); String salt = "some_random_salt"; String passWithSalt = password + salt; byte[] passBytes = passWithSalt.getBytes(); byte[] passHash = sha256.digest(passBytes); StringBuilder sb = new StringBuilder(); for(int i=0; i< passHash.length ;i++) { sb.append(Integer.toString((passHash[i] & 0xff) + 0x100, 16).substring(1)); } String generatedPassword = sb.toString(); return generatedPassword; } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return null; } 

你可以考虑使用commons-codec的实现

 String hash = org.apache.commons.codec.digest.DigestUtils.sha256Hex(password +"salt"); 

短语将是您要保护的密码。 key是salt,在散列之前附加到密码的唯一(和已知)字符串,用于击败彩虹表。 或者它至少应该是。 你的代码只是从密码本身获取它,这是毫无意义的。 它应该是一个与密码摘要一起存储的长随机字符串。