【问题标题】:SHA2 password hashing in javajava中的SHA2密码散列
【发布时间】: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 行)

提前致谢

【问题讨论】:

标签: java hash password-protection sha


【解决方案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;
      }
      

      【讨论】:

        猜你喜欢
        • 2018-12-27
        • 2011-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-18
        • 1970-01-01
        • 2019-02-15
        相关资源
        最近更新 更多