1概要

このチュートリアルでは、パスワードハッシュの重要性について説明します。

それが何であるか、なぜそれが重要なのか、そしてJavaでそれを実行するための安全で安全でない方法を簡単に見ていきます。

** 2ハッシュとは

ハッシュは、暗号ハッシュ関数と呼ばれる数学関数を使用して、指定されたメッセージから文字列、つまりハッシュを生成するプロセスです。

ハッシュ関数はいくつかありますが、ハッシュ化されたパスワードに合わせたものには、安全を期すために4つの主な特性が必要です。

  1. それは

    deterministic

    であるべきです:同じものによって処理される同じメッセージ

ハッシュ関数は常に同じ

ハッシュ

を生成する必要があります
。可逆的ではありません。

その

ハッシュ

。それは高いエントロピーを持っています。

大きく異なる

ハッシュ

。そしてそれは

collisions

に抵抗します

同じ

ハッシュ

を生成する

4つすべてのプロパティを持つハッシュ関数は、パスワードハッシュの強力な候補です。これらを組み合わせると、ハッシュからパスワードをリバースエンジニアリングすることが非常に困難になるためです。

また、ただし、

パスワードハッシュ関数は遅いはずです

。高速なアルゴリズムは、ハッカーが数十億をハッシュして比較することによってパスワードを推測しようとする攻撃を防止するのに役立ちます。 1秒あたりのパスワードの数兆])。

これらすべての基準を満たす優れたハッシュ関数には、




PBKDF2、BCrypt、および

SCryptがあります。

__まず最初に、いくつかの古いアルゴリズムとそれらがもはや推奨されなくなった理由を見てみましょう。


3非推奨:MD5

最初のハッシュ関数は、1992年に開発されたMD5メッセージダイジェストアルゴリズムです。

Java Message Digestを使用すると、これを簡単に計算でき、他の状況でも便利です。

しかし、ここ数年で


MD5はhttps://blog.avira.com/md5-the-broken-algorithm/[4番目のパスワードハッシュプロパティを無効にする]に発見されました。衝突それを締めくくるには、MD5は高速なアルゴリズムであり、したがってブルートフォース攻撃に対して無用です。

  • これらのため、MD5はお勧めできません。


4非推奨:SHA-512

次に、SHA-512を見てみましょう。これは、1993年にSHA-0から始まったSecure Hash Algorithmファミリーの一部です。


4.1. なぜSHA-512ですか?

コンピュータの能力が高まり、新しい脆弱性が見つかったため、研究者は新しいバージョンのSHAを導き出しました。新しいバージョンは次第に長さが長くなったり、時には研究者が基礎となるアルゴリズムの新しいバージョンを公開したりします。

SHA-512は、第3世代のアルゴリズムにおける最長鍵を表します。

  • SHA ** にはより安全なバージョンがありますが、https://docs.oracle.com/javase/1.5.0/docs/guide/security/CryptoSpec.html#AppA[SHA-512が最も強力に実装されています。 Java]。

** 4.2. Javaでの実装

それでは、SHA-512ハッシュアルゴリズムをJavaで実装する方法を見てみましょう。

まず、

salt

の概念を理解する必要があります。簡単に言えば、これは新しいハッシュごとに生成されるランダムなシーケンスです。

このランダム性を導入することで、ハッシュのエントロピーを増やし、

rainbow tables

として知られるハッシュの事前にコンパイルされたリストからデータベースを保護します。

私たちの新しいハッシュ関数はそれからおおよそになる:

salt <- generate-salt;
hash <- salt + ':' + sha512(salt + password)


4.3. 塩を生成する

saltを紹介するには、

davas.oracle.com/javase/7/docs/api/java/security/SecureRandom.html[SecureRandom]

java.security__のクラスを使用します。

SecureRandom random = new SecureRandom();
byte[]salt = new byte[16];
random.nextBytes(salt);

次に、

__

MessageDigest



クラスを使用して、


SHA-512

__hash関数に塩を使用して設定します。

MessageDigest md = MessageDigest.getInstance("SHA-512");
md.update(salt);

そしてそれが追加されたので、ハッシュパスワードを生成するために

digest

メソッドを使うことができます。

byte[]hashedPassword = md.digest(passwordToHash.getBytes(StandardCharsets.UTF__8));


4.4. なぜそれがお勧めできないのですか?

塩と一緒に使われるとき、https://en.wikipedia.org/wiki/Secure

Hash

Algorithms[SHHA-512]はまだ公平な選択です]、

しかしそこにはより強くより遅い選択があります

また、残りのオプションには重要な機能があります。

設定可能な強度


5 PBKDF2、BCrypt、およびSCrypt

PBKDF2、BCrypt、およびSCryptは3つの推奨アルゴリズムです。


5.1. なぜお勧めですか?

これらのそれぞれは遅く、そしてそれぞれが設定可能な強度を持つという素晴らしい特徴を持っています。

これは、コンピュータの強度が増すにつれて、入力を変更することによってアルゴリズムを遅くすることができることを意味します。

** 5.2. JavaでのPBKDF2の実装

さて、

塩は

パスワードハッシュ** の基本原則なので、PBKDF2にも必要です。

SecureRandom random = new SecureRandom();
byte[]salt = new byte[16];
random.nextBytes(salt);

次に、https://docs.oracle.com/javase/7/docs/api/javax/crypto/spec/PBEKeySpec.html[

PBEKeySpec

]および


SecretKeyFactory


これは

__PBKDF2WithHmacSHA1

__algorithmを使用してインスタンス化します。

KeySpec spec = new PBEKeySpec(password.toCharArray(), salt, 65536, 128);
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");

3番目のパラメータ(

65536

)は実質的に強度パラメータです。これは、このアルゴリズムが実行する反復回数を示し、ハッシュの生成にかかる時間が長くなります。

最後に、

__SecretKeyFactory

__を使ってハッシュを生成できます。

byte[]hash = factory.generateSecret(spec).getEncoded();

** 5.3. JavaでのBCryptとSCryptの実装

そのため、

BCryptおよびSCryptサポートはまだJava

に同梱されていませんが、一部のJavaライブラリではサポートされています。

それらのライブラリの1つがSpring Securityです。


6. Spring Security

によるパスワードハッシュ

JavaはPBKDF2とSHAの両方のハッシュアルゴリズムをネイティブでサポートしていますが、BCryptおよびSCryptアルゴリズムはサポートしていません。

幸いなことに、Spring Securityはhttps://docs.spring.io/spring-security/site/docs/4.2.4.RELEASE/apidocs/org/springframework/security/crypto/を通じて、これらすべての推奨アルゴリズムをサポートしています。 password/PasswordEncoder.html[

PasswordEncoder

]インターフェース:

  • ____MessageDigestPasswordEncoder – MD5およびSHA-512を提供


  • Pbkdf2PasswordEncoder

    はPBKDF2を提供します。

  • ____BCryptPasswordEncoderはBCryptを提供します。

  • ____SCryptPasswordEncoderはSCryptを提供します

  • PBKDF2、BCrypt、およびSCrypt用のパスワードエンコーダはすべて、パスワードハッシュの強度を設定するためのサポートが付属しています。

Spring Securityベースのアプリケーションがなくても、これらのエンコーダを直接使用できます。または、Spring Securityでサイトを保護している場合は、そのDSLを通じて、またはhttps://www.baeldung.com/spring-security-registration-password-encoding-bcrypt[依存性注入]を通じて、目的のパスワードエンコーダーを構成できます。 。

そして、上記の私たちの例とは異なり、これらの暗号化アルゴリズムは私たちのためにソルトを内部的に生成します。このアルゴリズムは、後でパスワードの検証に使用するために、ソルトを出力ハッシュ内に格納します。


7. 結論

そのため、パスワードハッシュについて詳しく説明しました。概念とその用途を探る。

そして、Javaでコーディングする前に、いくつかの歴史的なハッシュ関数と現在実装されているいくつかのハッシュ関数を調べました。

最後に、Spring Securityにはパスワード暗号化クラスが同梱されており、さまざまなハッシュ関数の配列が実装されていることがわかりました。