74760
PHPを学び始めて1年以内の者です。

**・$_SESSIONにパスワードを格納するのは安全ではない  
・DBにはハッシュ化したパスワードのみを保存**

以上をふまえ、

**ユーザー情報変更ページで、各々が自分のパスワードを変更をできるよう設定したい** のですが  
編集ページのform内に「現在のパスワード： ****** 」というようにアスタリスクで表示させたい場合、  
慣例となっているやり方はあるのでしょうか。  
（知りたいのは、どのようにパスワードを保存し、取り出すのか という点です）

どなたか、ご教授いただければ幸いです。  
どうぞよろしくお願いいたします。
CC BY-SA 4.0
2021-03-18T14:43:15.633
74746
2021-03-19T05:57:38.327
40891
question
php security
PHP　ユーザーログインパスワードの保存先
> 編集ページのform内に「現在のパスワード： ****** 」というようにアスタリスクで表示させたい場合、

この方法自体が慣例的ではないです。

アスタリスクで表示させていても実際はValueに数値を入力する必要がありXSSやその他の脆弱性よってパスワードを横取りされる可能性があります。  
コメントにある通りフォームでパスワードを見えなくするためだけの機能になるので実際はデータ自体はそのまま置く必要があります。

パスワード周りの基本的な方法としては  
・パスワード情報に関するものはハッシュ化したデータ以外持たない  
・パスワードが推測されるようなデータも持たない  
・パスワードの再設定についてはリセットを基本として、その際は別の認証方法を使う

別の認証方法についてはメール認証、電話番号認証などあります。

> アスタリスクの桁数をもとに、自分の設定したパスワードがどれだったか判断できることがあった

これについてはセキュリティリスクの一つとして報告されてもよい内容かと思いますので、  
余り真似しないほうがよいでしょう。
CC BY-SA 4.0
2021-03-19T02:10:31.373
74753
2021-03-19T03:05:54.057
2021-03-19T03:05:54.057
22665
22665
74746
answer
そもそも論として「ハッシュ化したパスワードのみを保存」している以上は web server / application server
側でもパスワードを復元できないわけです（そのためのハッシュ化）。そのため「「現在のパスワード： ******
」というようにアスタリスクで表示」すること自体ができませんし、できたら脆弱性です。
CC BY-SA 4.0
2021-03-19T02:38:27.847
74754
2021-03-19T02:38:27.847
8589
74746
answer
パスワードを平文のまま保存するのは良くないので "ハッシュ化した結果 = パスワードハッシュ" を代わりに保存するのが一般的ですが、ここでハッシュ化とは
**一方向に変換するアルゴリズム** なので、パスワードハッシュから元のパスワードを取り出すことは出来ません。

認証が必要な場面では「保存されたパスワードハッシュ」と「ユーザーが入力したパスワードを元に (同じ手順で)
パスワードハッシュを生成」した値をそれぞれ比較して一致するかを見ています。

PHP であればこの辺りの操作を
[password_hash](https://www.php.net/manual/ja/function.password-hash.php) や
[password_verify](https://www.php.net/manual/ja/function.password-verify.php)
を使うことで簡単に実装出来ます。

>
```

>     password_hash ( string $password , mixed $algo , array $options = ? ) :
> string|false
>  
```

>
> password_hash() は、強力な一方向ハッシュアルゴリズムを使って 新しいパスワードハッシュを作ります。

>
```

>     password_verify ( string $password , string $hash ) : bool
>  
```

>
> 指定したハッシュがパスワードにマッチするかどうかを調べます。
CC BY-SA 4.0
2021-03-19T03:33:14.050
74758
2021-03-19T03:33:14.050
3060
74746
answer
設定画面などでパスワードを変更する時は  
・現在のパスワードを再入力。  
・新しいパスワードを入力。  
・確認用に新しいパスワードを再入力。  
入力欄が3つは必要。

現在のパスワードの情報は一切表示しなくていい。

入力した現在のパスワードと保存している暗号化したパスワードで変更して大丈夫か確認。  
さらに新しいパスワードと確認用が一致するかも確認。  
パスワード変更なんて危険な箇所は二重に確認が必要。

セキュリティリスクとしては「ログインしたままのブラウザを他人が操作してるかもしれない」  
なので危険な箇所では正しいパスワードを再度入力させて確認しないといけない。

↑はログインできてる場合。  
パスワードを忘れてログインできない時用にメールでのパスワードリセット機能も必要。

こういう部分は自分で考えず有名サイトのやり方を真似すればいい。  
***なんて表示してるサイトはない。
CC BY-SA 4.0
2021-03-19T05:57:38.327
74760
2021-03-19T05:57:38.327
21074
74746
answer