web-dev-qa-db-ja.com

PHPでパスワードハッシュを復号化するにはどうすればよいですか?

パスワードを解読する必要があります。パスワードはpassword_hash関数で暗号化されます。

$password = 'examplepassword';
$crypted = password_hash($password, PASSWORD_DEFAULT);

ここで、$ cryptedがデータベース(ユーザー名、パスワードなどを含む「ユーザー」テーブルがある)に保存されていると仮定し、ログインする必要があります。ユーザーが入力したパスワードが暗号化されたパスワードと一致するかどうかを確認する必要がありますデータベースに保存されます。

これはSQLコードです...

$sql_script = 'select * from USERS where username="'.$username.'" and password="'.$inputpassword.'"';

...しかし、$ inputpasswordは暗号化されていないため、テーブルusersのパスワードフィールドに格納されているものとは異なります...

だから、password_hashの使用後に復号化する関数がありますか?または、暗号化方法を変更する必要がありますか?それとも他に何?

12
dariodp

Bcryptは一方向のハッシュアルゴリズムであり、ハッシュを復号化することはできません。 password_verify を使用して、パスワードが保存されたハッシュと一致するかどうかを確認します。

<?php
// See the password_hash() example to see where this came from.
$hash = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq';

if (password_verify('rasmuslerdorf', $hash)) {
    echo 'Password is valid!';
} else {
    echo 'Invalid password.';
}
?>

あなたの場合、ユーザー名のみを使用してSQLクエリを実行します。

$sql_script = 'select * from USERS where username="'.$username.'"';

上記の例に似たコードを使用して、PHPでパスワード検証を行います。

編集:この方法でクエリを構築することは非常に危険です。入力を適切にエスケープしないと、コードはSQLインジェクション攻撃に対して脆弱になります。 this SO SQLインジェクションを防ぐ方法についての回答を参照してください。

23
Gergo Erdosi

パスワードを解読する必要があります。パスワードはpassword_hash関数で暗号化されます。

$password = 'examplepassword';
$crypted = password_hash($password, PASSWORD_DEFAULT);

password_verify、またはアプリケーションまたはデータベースへの不正アクセスを試みています。他の人はpassword_verifyので、不正アクセスを取得する方法は次のとおりです。システムにアクセスしようとすると、悪人がよくやることです。

最初に、プレーンテキストパスワードのリストを作成します。プレーンテキストリストは、Adobeのような企業からの大量のデータ侵害により、多くの場所で見つけることができます。リストをソートしてから、上位10,000または100,000程度を取得します。

次に、ダイジェストパスワードのリストを作成します。パスワードを暗号化またはハッシュします。上記のコードに基づいて、ソルトが使用されているようには見えません(または固定ソルト)。これにより、攻撃が非常に簡単になります。

第三に、リスト内のダイジェストされたパスワードごとに、パスワードを使用しているユーザーを見つけるために選択を実行します。

$sql_script = 'select * from USERS where password="'.$digested_password.'"'

第四に、利益。

そのため、悪者はユーザーを選択してパスワードを逆にしようとするのではなく、一般的なパスワードを選択して、それを使用しているユーザーを見つけようとします。オッズは悪者の側にあります...

悪者がこれらのことを行うので、notにユーザーに共通のパスワードを選択させます。この場合、ProCheck、EnFilterまたはHyppocrates(など)をご覧ください。不正なパスワードを拒否するフィルタリングライブラリです。 ProCheckは非常に高い圧縮率を実現し、数百万のWordパスワードリストを30KBのデータファイルにダイジェストできます。

1
jww

パスワードはユーザーに脆弱性をもたらすため、復号化できません。そのため、単にpassword_verify()メソッドを使用してパスワードを比較できます。

_if(password_verify($upass, $userRow['user_pass'])){
     //code for redirecting to login screen }
_

ここで、_$upass_はユーザーが入力したパスワードで、_$userRow['user_pass']_はpassword_hash()関数によって暗号化されるデータベースのuser_passフィールドです。

0
user8838403

誰かがついにpassword_hashを解読するスクリプトを作成したようです。これをチェックアウトしてください: https://Pastebin.com/Sn19ShVX

<?php
error_reporting(0);

# Coded by L0c4lh34rtz - IndoXploit

# \n -> linux
# \r\n -> windows
$list = explode("\n", file_get_contents($argv[1])); # change \n to \r\n if you're using windows
# ------------------- #

$hash = '$2y$10$BxO1iVD3HYjVO83NJ58VgeM4wNc7Gd3gpggEV8OoHzB1dOCThBpb6'; # hash here, NB: use single quote (') , don't use double quote (")

if(isset($argv[1])) {
    foreach($list as $wordlist) {
        print " [+]"; print (password_verify($wordlist, $hash)) ? "$hash -> $wordlist (OK)\n" : "$hash -> $wordlist (SALAH)\n";
    }
} else {
    print "usage: php ".$argv[0]." wordlist.txt\n";
}
?>
0
Cholis

Password_verify()関数を使用します

if (password_vertify($inputpassword, $row['password'])) {
  print "Logged in";
else {
    print "Password Incorrect";
}
0
user10693192