私は現在Javaを使用してアプリケーションを作成しており、Javaを使用してパスワードの暗号化をグーグルで検索しましたが、結果は非常に大きく、圧倒されたと感じました。Javaを使用してパスワードを暗号化および復号化するにはどうすればよいですか?また、パスワードを暗号化および復号化するためのベストプラクティスは何ですか?MD5は一方向のハッシュなので、行く方法ではないと思います。私はフレームワークとしてstruts2を使用していますが、パスワード暗号化を提供するかどうか疑問に思っていました
6 に答える
更新:
JBCryptをお試しください:
String password = "MyPassword123";
String hashed = BCrypt.hashpw(password, BCrypt.gensalt(12));
System.out.println(hashed); // $2a$12$QBx3/kI1SAfwBDFOJK1xNOXK8R2yC7vt2yeIYusaqOisYbxTNFiMy
ここからjBCrypt-0.3をダウンロードします。詳細については、READMEファイルを確認してください。
また、MD5はすでに壊れているため、使用することはお勧めしません。その代わりに、SHA512を使用できます。これは、安全なハッシュ方式であり、MessageDigestを使用できます。私のプロジェクトの1つで使用している以下のコードは、完全に機能します
public String encode(String password, String saltKey)
throws NoSuchAlgorithmException, IOException {
String encodedPassword = null;
byte[] salt = base64ToByte(saltKey);
MessageDigest digest = MessageDigest.getInstance("SHA-512");
digest.reset();
digest.update(salt);
byte[] btPass = digest.digest(password.getBytes("UTF-8"));
for (int i = 0; i < ITERATION_COUNT; i++) {
digest.reset();
btPass = digest.digest(btPass);
}
encodedPassword = byteToBase64(btPass);
return encodedPassword;
}
private byte[] base64ToByte(String str) throws IOException {
BASE64Decoder decoder = new BASE64Decoder();
byte[] returnbyteArray = decoder.decodeBuffer(str);
if (log.isDebugEnabled()) {
log.debug("base64ToByte(String) - end");
}
return returnbyteArray;
}
まあ、私が知っているように、私たちはパスワードを保護するためにいくつかのアルゴリズムに従っています。
- MD5-
- PBKDF2-
- SHA-
- BCryptとSCrypt-
このBCryptとSCryptの中には、パスワードセキュリティのためのより安全な方法があります。
Javaでその問題を解決することに専念する非常に素晴らしいプロジェクトがあります。基本的に、ユーザーパスワードを暗号化する2つの方法を提供します。-MD5
-SHA1
リンクを見てください: jasypt
私にとっては、MD5が最善の方法であり、ユーザーがパスワードを忘れた場合にパスワードを復号化する必要がないことを確認しました。新しいパスワードを生成する方法をユーザーに提供し、ログインのために既存のハッシュだけを比較できます。データベースとユーザーが入力したもの
常に 一方向ハッシュアルゴリズムを使用してください。
MD5ハッシュでGOと言います。パスワードをDBに保存するときは、MD5ハッシュを使用してください。そのため、パスワードをパスとして持っている場合、ハッシュ後、パスワードはasjasdfklasdjf789asdfalsdfashdflasdf(32文字)として保存されます。
あなたが言ったように、あなたはパスワードも解読したいと思います。 私はそれをしないと言うでしょう。パスワードをDBと照合しながら、パスワードをハッシュし、その文字列をデータベースにあるものと比較することができます。
if (DoHashMD5(myPass).equals(rs.getString(2))) {
System.out.print("You are registered user!!!");
} else {
System.out.print("Invalid user!!!");
}
これrs.getString(2)
がクエリパラメータになります。