あなたがすでに知っていることをあなたに話す危険を冒して...
- パスワードを保存しない -- 代わりに保存してハッシュと比較する
- パスワード ハッシュには Bcrypt を使用します。これは遅いため、ブルート フォース攻撃を防ぐのに適しています。
- ソルトを使用 -- レインボー テーブル スタイルの攻撃を防ぐ
- SSL (https) を使用 -- パスワードが平文で見られないようにする
Mindrot jBCrypt ライブラリ
を使用する例を次に示します。
def PasswordHash( name:String, pwd:String, version:Int = 1 ) : String = {
if( バージョン == 2 && false )
{
// 変更は新しいバージョンとして作成し、ここに追加する必要があります
""
}
そうしないと
{
import org.mindrot.jbcrypt.BCrypt // jbcrypt-0.3m.jar
// ソルトはパスワード ハッシュに組み込まれます
val salt = BCrypt.gensalt(12) // デフォルトは 10、または 2**10 ラウンドです。より多くのラウンドは遅くなります。
BCrypt.hashpw( (名前 + pwd), 塩 )
}
}
def VerifyPassword( name:String, pwd:String, hash:String, version:Int = 1 ) : Boolean = {
if( バージョン == 1 )
{
import org.mindrot.jbcrypt.BCrypt // jbcrypt-0.3m.jar
BCrypt.checkpw( (名前 + pwd), ハッシュ )
}
そうしないと
間違い
}
> PasswordHash( "johnny", "mypassword" )
res4: 文字列 = $2a$12$dHIlTL14.t37Egf7DqG4qePE446GzzhIUAVuewMfkhfK0xxw3NW6i
> VerifyPassword(「johnny」、「mypassword」、「$2a$12$dHIlTL14.t37Egf7DqG4qePE446GzzhIUAVuewMfkhfK0xxw3NW6i」)
res5: ブール値 = true
> VerifyPassword(「johnny」、「mommiespassword」、「$2a$12$dHIlTL14.t37Egf7DqG4qePE446GzzhIUAVuewMfkhfK0xxw3NW6i」)
res6: ブール値 = false
あなたがやろうとしていることについては、「名前」、「パスワードハッシュ」、および「ハッシュバージョン」を構成に保存すると思います。