java中的SHA2密码散列
Posted
技术标签:
【中文标题】java中的SHA2密码散列【英文标题】:SHA2 password hashing in java 【发布时间】:2011-10-13 23:44:18 【问题描述】:我正在尝试使用 SHA2 对一些密码进行哈希处理。
我在哪里可以获得用于制作的 java 代码的 sn-p?
我看过那个帖子,但我缺少一些东西: SHA2 password storage with Java
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 行)
提前致谢
【问题讨论】:
仅供参考:您可能会阅读一些关于密码哈希的问题。虽然散列密码很好,但正确地执行它并非易事。这个问题有一些很好的答案:Suggestions for library to hash passwords in Java 【参考方案1】:Phrase 将是您要保护的密码。 key
是盐,一个独特的(和已知的)字符串,在散列之前附加到您的密码,以击败彩虹表。或者至少应该是。您的代码只是从密码本身中获取它,这是毫无意义的。它应该是一个长的随机字符串,与密码摘要一起存储。
【讨论】:
【参考方案2】:你可以考虑使用 commons-codec 的实现
String hash = org.apache.commons.codec.digest.DigestUtils.sha256Hex(password +"salt");
【讨论】:
这不在 Java SE 中【参考方案3】:首先,您需要明确自己想要做什么。您说您想对密码进行哈希处理,但您使用的代码是用于 MAC (Message Authentication Code),具体来说是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;
【讨论】:
【参考方案4】:我修改了一点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;
【讨论】:
以上是关于java中的SHA2密码散列的主要内容,如果未能解决你的问题,请参考以下文章