さっしーブログ

埼玉県在住のシステムエンジニアです。基本的には技術的な内容を中心に発信していきます。

安全にパスワードをハッシュする方法

 
DBにパスワードを登録する際に、平文のまま保存するのではなくハッシュ化して保存するのが一般的かと思いますが、その際のハッシュ化する処理を以下にまとめました。
 
※コピペでそのまま使用可能
public static String getSafetyPassword(String password, String salt) {
 
     char subCharArry = password.toCharArray();
     byte hashedSalt = getHashedSalt(salt);
 
     PBEKeySpec keySpec = new PBEKeySpec(subCharArry, hashedSalt, 1000, 256);
 
     SecretKeyFactory skf;
     String hashSub = null;
 
     try {
 
          skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
 
     } catch (NoSuchAlgorithmException e) {
 
          throw new RuntimeException(e);
 
     }
 
     SecretKey secretkey;
     try {
 
          secretkey = skf.generateSecret(keySpec);
 
     } catch (InvalidKeySpecException e) {
 
          throw new RuntimeException(e);
 
     }
 
     byte passByteAry = secretkey.getEncoded();
     StringBuilder sb = new StringBuilder();
     for (byte b : passByteAry) {
 
          sb.append(String.format("%02x", b & 0xff));
 
     }
 
     hashSub = sb.toString();
 
     return hashSub;
 
}
 
private static byte getHashedSalt(String salt) {
 
     MessageDigest messageDigest;
 
     try {
 
          messageDigest = MessageDigest.getInstance("SHA-256");
 
     } catch (NoSuchAlgorithmException e) {
 
          throw new RuntimeException(e);
 
     }
 
     messageDigest.update(salt.getBytes());
     return messageDigest.digest();
 
}