質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Spring Security

Spring Securityは、Springのサブプロジェクトの一つでWebアプリケーションに必要な機能を追加します。正規ユーザーであるかを確認するための「認証機能」と、ユーザーのアクセスを制御する「認可機能」を簡単に追加することが可能です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

パスワード

パスワードは主に情報にアクセスする際に扱われます。主に、アクセス可能なユーザーを限定する手段として使われます。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

1回答

2672閲覧

Argon2 の verify(hash, rawPassword) やmatches(rawPassword, hash) の安全性の意見をいただきたいです

Mopu

総合スコア5

Spring Security

Spring Securityは、Springのサブプロジェクトの一つでWebアプリケーションに必要な機能を追加します。正規ユーザーであるかを確認するための「認証機能」と、ユーザーのアクセスを制御する「認可機能」を簡単に追加することが可能です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

パスワード

パスワードは主に情報にアクセスする際に扱われます。主に、アクセス可能なユーザーを限定する手段として使われます。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2021/07/28 09:39

編集2021/07/28 09:48

前提・実現したいこと

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>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

①ハッシュ化したパスワードがソルトを付与していない文字列とverifyで比較できるのであれば、ただのハッシュ化とほとんど同じではないのか?

比較すべき「ハッシュ値」には、ソルトも含まれています。なので、保存される「ハッシュ値」は「保存する際にランダムに生成したソルト+そのソルトを使ってハッシュ化した値」となっているので、「全部同じハッシュ」が保存されるわけではありません。

投稿2021/07/28 09:53

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2021/07/28 09:53

> ②入力された文字列に、パスワードのハッシュ化の際に用いたものと同一のソルトを付加する。 これは比較関数が自動で行ってくれます。
maisumakun

2021/07/28 09:55

> パスワードにソルトをくっつけた状態でハッシュ化したものと生パスワードでも比較が可能なようなのですが もちろん、「自動生成のソルト」以外に「自分で作成したソルト」を追加して処理することは可能ですが、(自前ソルトをどのように管理するかなど)煩雑になるだけでセキュリティ上の効果は余り見込めません。
maisumakun

2021/07/28 09:57

実際に得られるハッシュ値は「$argon2i$v=19$m=16,t=2,p=1$MUw2NWtPbjBoNDRCbnFjYQ$C1dAPEoaOVt3oyZCIHgXpA」のようになっていますが、このうち「MUw2NWtPbjBoNDRCbnFjYQ」はソルトです。
maisumakun

2021/07/28 10:04

ソルトは主に「同じパスワードが同じハッシュ値になるのを防ぐ」ために付与しているものですので、「ソルト自体を秘匿する」ような運用はあまり行われません。
Mopu

2021/07/30 03:54

自分の中にだいぶ落とし込めたとおもいます 回答いただきありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問