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

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

新規登録して質問してみよう
ただいま回答率
85.50%
セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

1239閲覧

PHP MD5ハッシュ値総当たり

退会済みユーザー

退会済みユーザー

総合スコア0

セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2021/05/18 15:37

編集2021/05/18 17:18

PHP MD5ハッシュ値総当たりは特に何も考えず質問してしまい申し訳ありませんでした

色々な追記がある中でやりたかったことを書きます
まず、シャッフルしたmd5ハッシュ値がパスワードとして記録されているものとします
md5ハッシュ値をシャッフルした場合に、照合できないじゃないかとご指摘いただきました

パスワードとしてシャッフルされたmd5ハッシュ値を照合する仕組みを考えてみました

ユーザー側が入力したパスワードをMD5ハッシュして一文字づつ分割して配列に代入
同じ文字、文字数が何個あるかをカウント
記録されてあるシャッフルされたMD5ハッシュも同じように1文字づつ分割して代入
同じ文字、文字数が何個あるかをカウント

入力されたパスワードのMD5ハッシュと記録されているシャッフルされたMD5ハッシュと
同じ文字、文字の数が一致してるかで照合

以上になりますが、何か問題点があればご指摘ください
これらは実装するものではなく、一時的な案で考えたものになります
当方素人ですのでソースに雑い部分があると思いますがご了承下さい

追記です
パスワードをMD5で保存する為の思考ではありません
結果的にそういう形として提示しているだけで、
総当たり対策である事が目的です
完全なる興味本位です

<?php $hit=0; $md5_array=[]; $shuffle_md5_array=[]; $md5_string="hello";//ユーザーがパスワードにhelloと入力したと仮定 $password="09bdb97a11a44551cd769b47209c2112";//DBに記録されてるパスワードと仮定 helloをmd5ハッシュしてシャッフルしたもの $md5_str=md5($md5_string); $md5_string=str_split($md5_str); foreach($md5_string as $value){ $md5_array[$value].=$value; } foreach($md5_array as $key => $value){ $md5_array[$key]["md5_length"]=substr_count($value,$key); } $shuffle_md5_string=str_split($password); foreach($shuffle_md5_string as $value){ $shuffle_md5_array[$value].=$value; } foreach($shuffle_md5_array as $key => $value){ $shuffle_md5_array[$key]["md5_length"]=substr_count($value,$key); } foreach($md5_array as $key => $value){ if($md5_array[$key]["md5_length"]==$shuffle_md5_array[$key]["md5_length"]){$hit++;}else{$hit--;}//MD5ハッシュとシャッフル後のハッシュの判定 判定基準は同じ文字が何個あるか、同じ文字であるか } if($hit==count($md5_array)){//完全一致でログイン echo "ログイン"; }else{ echo "不一致"; } ?>

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

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

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

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

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

AbeTakashi

2021/05/18 16:59 編集

まずお聞きしたいのが、わざわざmd5()を使ってパスワードを保存する目的はなんでしょうか? 興味本位ですかね? わざわざmd5()を使わずともpassword_hash()を使えば安全性はそれなりに担保できると思うのですが。 参考 https://www.php.net/manual/ja/function.password-hash.php https://teratail.com/questions/113248 https://qiita.com/rana_kualu/items/3ef57485be1103362f56 質問者が書かれたプログラムの安全性に関してはおそらくセキュリティのプロの方が回答を付けてくれると思うので私は何もふれませんが、パスワード保存処理を自作することは決して安全ではないと思います。ということで、繰り返しになりますが「わざわざmd5()を使ってパスワードを保存する目的」を質問文に追記頂ければと思います。おそらくその内容を加味して、セキュリティのプロの方が気の利いた回答をしてくれると思いますよ。
退会済みユーザー

退会済みユーザー

2021/05/18 17:00

md5()を使ってパスワードを保存というよりも、 総当たり対策的なもので、一時的に頭に浮かんだだけです 完全な興味本位です よくわからないことをよくやろうとしてるな、とむかつく方もいると思うのですが まぁ安全は無いから考えるだけ無駄って事でしょうか PS.password_hash()とかその他手法があるのは存じております
AbeTakashi

2021/05/18 17:13

なるほど、password_hash()を知っていて、今回の件は興味本位ということを回答者に知らせるのは非常に重要だと思いますよ。質問文に追記すべきだと思います。 参考) https://teratail.com/help/avoid-asking 「プログラミングに関して本当に困っている人をサポートすること、また、価値のあるコンテンツを世の中に残し届けることを目的としています。」 ともありますので、その辺も考慮して質問文を考えて頂くのがいいと思います。困っているのかそうでないのかは、このサイトにおいてはたぶんすごく重要です。
hoshi-takanori

2021/05/18 20:43

一文字づつ分割して配列に入れてソートしたもの同士を比べるのが簡単でしょうね。 セキュリティを考える際には、どういう場面で何を守るのかを考えることが重要です。 ・外部からの総当たりログインの場合、回答の通り、間違ったパスワードで認証される確率が高まるので、有害 ・ハッシュが流出した場合に元のパスワードを知られないためには、md5 をそのまま保存するよりはちょっとだけマシかもしれませんが、ソートして比べればいいだけなので、ソルトを加える方法と比べたらほとんど無意味 ということになると思います。
guest

回答1

0

ベストアンサー

要するに、

入力されたパスワードのMD5ハッシュと記録されているシャッフルされたMD5ハッシュと

同じ文字、文字の数が一致してるかで照合

が単純な照合よりもよりセキュアかどうか、を聞きたいということなのでしょうか。

答えはNoです。

理由は単純です。異なるハッシュで同じ文字種文字数のハッシュが認証されてしまうからです。
すなわち登録されたパスワードと異なるパスワードが認証される確率が高まります。

例えば 0123456789abcdef0123456789abcdeffedcba9876543210fedcba9876543210 は異なるハッシュですが、文字種ごとの文字数をカウントすると両者一致するので認証が通ってしまいます。

そして総当たり対策には全くなりません。逆に総当たりでの脆弱度を増やしてしまっています。

総当たり対策は一定回数失敗でロックすることや多要素認証が有効でしょう。

投稿2021/05/18 17:45

hope_mucci

総合スコア4447

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問