散列仅返回8或9个字符

时间:2018-11-21 15:43:57

标签: java hash

提供的链接无法回答问题。在MessageDiggest中说:

toString()
Returns a string representation of this message digest object.

我不清楚为什么总是8或9个字符。

我可以使用以下方法创建哈希密码。它仅返回8或9个字符,我想知道它是否有问题:

import java.security.MessageDigest;
import java.security.SecureRandom;
import java.security.NoSuchAlgorithmException;
import java.io.UnsupportedEncodingException;

public class Password {
   public static void main(String[] args) {

      String[] saltPassword = createPassword("password");

      System.out.println("Salt = " + saltPassword[0]);
      System.out.println("Password = " + saltPassword[1]);
   }

   private static String[] createPassword(String password) {
       String [] saltPassword = new String[2];
      try{  
         SecureRandom random = new SecureRandom();
         byte[] salt = new byte[32];
         random.nextBytes(salt);

         MessageDigest md = MessageDigest.getInstance("SHA-256");
         md.update(salt);
         md.update(password.getBytes("UTF8"));
         byte[] digest = md.digest();

         saltPassword[0] = salt.toString();
         saltPassword[1] = digest.toString();    

         System.out.println(digest);


        }catch(NoSuchAlgorithmException e1){
            System.out.println("FATAL ERROR: " + e1);
            System.exit(0);
        }catch(UnsupportedEncodingException e2){
            System.out.println("FATAL ERROR: " + e2);
            System.exit(0);
        }

      return(saltPassword);
   }

}

1 个答案:

答案 0 :(得分:1)

尝试这个。您的代码没有问题,您正在打印对象引用。 SHA-256生成等于32个字节的64个长度的十六进制数据。您可以使用 DatatypeConverter 类将此字节数据转换为另一种格式,但是下面的代码可能可以解决您的问题。

 private static String[] createPassword(String password) {
    String [] saltPassword = new String[2];
    try{
        SecureRandom random = new SecureRandom();
        byte[] salt = new byte[32];
        random.nextBytes(salt);

        MessageDigest md = MessageDigest.getInstance("SHA-256");
        md.update(salt);
        md.update(password.getBytes("UTF8"));
        byte[] digest = md.digest();

        saltPassword[0] = DatatypeConverter.printHexBinary(salt);
        saltPassword[1] = DatatypeConverter.printHexBinary(digest);

        System.out.println(DatatypeConverter.printHexBinary(digest));


    }catch(NoSuchAlgorithmException e1){
        System.out.println("FATAL ERROR: " + e1);
        System.exit(0);
    }catch(UnsupportedEncodingException e2){
        System.out.println("FATAL ERROR: " + e2);
        System.exit(0);
    }

    return(saltPassword);
}