ホームページ > Java > &#&チュートリアル > PBKDF2 を使用して Java でパスワードを安全にハッシュするにはどうすればよいですか?

PBKDF2 を使用して Java でパスワードを安全にハッシュするにはどうすればよいですか?

Linda Hamilton
リリース: 2024-12-26 05:30:46
オリジナル
682 人が閲覧しました

How Can I Securely Hash Passwords in Java Using PBKDF2?

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

パスワードを平文で保存すると、重大なセキュリティ リスクが生じます。機密データを保護するには、保存する前にパスワードをハッシュすることが重要です。このプロセスには、平文のパスワードを固定サイズの暗号化形式に変換することが含まれます。この形式は、元に戻すことができず、解読すると計算コストが高くなります。 Java は、パスワード ハッシュのための堅牢な機能を提供し、ユーザー資格情報のセキュリティを確保します。

安全なパスワード ハッシュに PBKDF2 を使用する

Java 6 の SunJCE ライブラリには、PBKDF2 (Password- Based Key Derivation Function 2)、パスワード ハッシュの業界標準アルゴリズム。ランダム ソルトと高い計算コストを組み込むことにより、ブルート フォース攻撃とレインボー テーブル攻撃を防ぐように設計されています。

PBKDF2 を使用したパスワード ハッシュの実装

  1. ソルトの作成: 事前計算されたレインボーの使用を防ぐためにランダムなソルトを生成します。
  2. パスワードをハッシュします: PBKDF2 アルゴリズムを利用して、パスワードとソルトからハッシュを導出します。
  3. ハッシュされたパスワードを保存します: ソルトとハッシュされたパスワードをデータベースに安全に保存します。

パスワードの検証中ログイン

ユーザーのログイン時:

  1. ソルトの取得: ユーザーのアカウントに関連付けられたソルトを取得します。
  2. 送信されたパスワードをハッシュします:取得したソルトを使用して送信されたパスワードのハッシュ。
  3. ハッシュを比較:計算されたハッシュは、保存されているハッシュされたパスワードと一致します。一致する場合、パスワードは正しいです。

パスワードハッシュのコード例

import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;
import java.util.Arrays;
import java.util.Base64;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;

public class PasswordAuthentication {

  public String hash(char[] password) {
    byte[] salt = new byte[SIZE / 8];
    random.nextBytes(salt);
    byte[] dk = pbkdf2(password, salt, 1 << cost);
    byte[] hash = new byte[salt.length + dk.length];
    System.arraycopy(salt, 0, hash, 0, salt.length);
    System.arraycopy(dk, 0, hash, salt.length, dk.length);
    return ID + cost + '$' + enc.encodeToString(hash);
  }

  public boolean authenticate(char[] password, String token) {
    Matcher m = layout.matcher(token);
    if (!m.matches())
      throw new IllegalArgumentException("Invalid token format");
    int iterations = iterations(Integer.parseInt(m.group(1)));
    byte[] hash = Base64.getUrlDecoder().decode(m.group(2));
    byte[] salt = Arrays.copyOfRange(hash, 0, SIZE / 8);
    byte[] check = pbkdf2(password, salt, iterations);
    int zero = 0;
    for (int idx = 0; idx < check.length; ++idx)
      zero |= hash[salt.length + idx] ^ check[idx];
    return zero == 0;
  }

  private byte[] pbkdf2(char[] password, byte[] salt, int iterations) {
    KeySpec spec = new PBEKeySpec(password, salt, iterations, SIZE);
    try {
      SecretKeyFactory f = SecretKeyFactory.getInstance(ALGORITHM);
      return f.generateSecret(spec).getEncoded();
    }
    catch (NoSuchAlgorithmException ex) {
      throw new IllegalStateException("Missing algorithm: " + ALGORITHM, ex);
    }
    catch (InvalidKeySpecException ex) {
      throw new IllegalStateException("Invalid SecretKeyFactory", ex);
    }
  }
}
ログイン後にコピー

結論

PBKDF2 を使用したパスワードのハッシュ化は、ユーザー データを保護するために不可欠なセキュリティ対策です。堅牢なパスワード ハッシュを実装することで、開発者はアプリケーションのセキュリティを大幅に強化し、データ侵害のリスクを最小限に抑えることができます。

以上がPBKDF2 を使用して Java でパスワードを安全にハッシュするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート