前提・実現したいこと
SpringBootを用いてログイン機能を有するWEBページを作ろうとしてます。
ログインの際に必要なログインIDとハッシュ化したパスワードの組み合わせをデータベースに保存しておく必要があるのですが、その際にパスワードのハッシュ化(鍵導出関数)として Argon2 の使用を検討しております。
調べてみるとjvmやSpringSecurityのパッケージで暗号化アルゴリズムの Argon2 を用いることができ、その中のメソッドで
argon2.verify(hash, rawPassword)
や、
Argon2PasswordEncoder.matches(rawPassword, encodedPassword)
を用いれば、(ランダムなソルトをくっ付けてハッシュ化した場合でも)ハッシュ値と入力パスワードの比較が可能なようでした。
パスワードにソルトをくっつけた状態でハッシュ化したものと生パスワードでも比較が可能なようなのですが、これはセキュリティ的に大丈夫なのでしょうか。
ソルトを足すことで同じパスワードでも異なるハッシュ値になることが利点なのに、上記のようなメソッド一つでハッシュ化したパスワードと生パスワードが対応しているかどうかの判定ができてしまっても大丈夫なのでしょうか。
現在の私の意見をまとめると、
①ハッシュ化したパスワードがソルトを付与していない文字列とverifyで比較できるのであれば、ただのハッシュ化とほとんど同じではないのか? ②入力された文字列に、パスワードのハッシュ化の際に用いたものと同一のソルトを付加する。 →それらを比較して初めて意味のあるものなのではないか?
と思っております。実際に自分の考えは正しいでしょうか。
ググってみても自分と同じ意見の方は見当たらなかったのでおそらく安全な手法だと思われるのですが、いまいち理解できていない状況です。
見当違いなことを言っていたら申し訳ありません。
該当のソースコード
JAVA
1//default: (salt, Hash) = (16, 32)bytes 2//ソルトは、hashを実行する度にランダムで16bitの文字列が生成 3Argon2 argon2 = Argon2Factory.create(); 4 5char[] password = "HelloWorld".toCharArray(); 6String hash = argon2.hash(10, 1024, 1, password); 7//EX)hash = $argon2i$v=19$m=1024,t=10,p=1$2/1OvbFtofdeaUYP/aZKFA$uFzoH5+RUJPF2UmPe59U7/Ci7sE1XKYasR7N+oS4gwI 8//といったように保存されます 9 10char[] password2 = "HelloWorld".toCharArray(); 11char[] password3 = "abc".toCharArray(); 12 13if(argon2.verify(hash, password2) == true) System.out.println("hash == pass2"); 14//printされる 15 16if(argon2.verify(hash, password3) == true) System.out.println("hash == pass3");
また、私の環境では試していないのですが
JAVA
1boolean pwMatches = this.passwordEncoder.matches(password, 2 appUserRecord.getPasswordHash()); 3 if (pwMatches) { 4 5 // upgrade password
のようにmatches(生パスワード, ハッシュ化されたパスワード)を用いることができるようです。
Argon2についての参考サイト
https://argon2.online/
https://www.twelve21.io/how-to-use-argon2-for-password-hashing-in-java/
https://mkyong.com/java/java-password-hashing-with-argon2/
https://golb.hplar.ch/2020/05/passwordhashupgrade.html
補足情報(FW/ツールのバージョンなど)
argon2-jvmを使用するためにpom.xmlに記述する内容
<dependency> <groupId>de.mkammerer</groupId> <artifactId>argon2-jvm</artifactId> <version>2.7</version> </dependency>
Spring Securityを使用するためにpom.xmlに記述する内容
<dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-crypto</artifactId> <version>5.3.2.RELEASE</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcpkix-jdk15on</artifactId> <version>1.65</version> </dependency>
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/28 09:53
2021/07/28 09:55
2021/07/28 09:57
2021/07/28 10:04
2021/07/30 03:54