web-dev-qa-db-ja.com

ソルトを知って、ハッシュsha256暗号化をデコードします

Webアプリケーションのログインシステムを作成しています。 DBにパスワードを保存するために、sha256を使用してパスワードを次のように暗号化しています。

$salt ="sometext";
$escapedPW="userpass";
$saltedPW =  $escapedPW . $salt;
$hashedPW = hash('sha256', $saltedPW);
echo "<center>".$hashedPW."</center>";

データベースには、ユーザー、ユーザーのパスワード、およびハッシュの作成とユーザーのログインの検証に使用されるソルトが格納されています。現在、パスワードを記載したメールをユーザーに送信する機能を実行していますが、ユーザーがメールを受信すると、sha256暗号化パスワードに保存されるため、ユーザーは、ユーザーが想定しているパスワードではなく、長い文字列を受信します。知るために。

私の質問は、実際のユーザーパスワードとパスワード以外の暗号化を送信する方法はありますか?つまり、ソルトを知っている場合は、sha256の逆を行う方法がありますか?不可能な場合は、暗号化キーの逆を完了し、実際のパスワードを電子メールでユーザーに送信するために、どの暗号化方法をお勧めしますか。

9
franvergara66

あなたの質問のコメントで述べられているように、ハッシュを逆にすることは実際にはオプションではありません。

しかし、あなたができること、そしてこれは他の誰もがすることです。フォームが投稿する登録コード(例:register.php)で、PHPスクリプトにパスワードを電子メールで送信させ、暗号化してデータベースに保存させることができます。

ある種の登録フォームがあり、そのフォームが新しいユーザーの詳細を別の(または同じ)phpスクリプトに投稿していると思いますね。

たとえば、私のフォームに<form method="post" action="register.php">のようなものが書かれている場合

そしてregister.phpで私は次のようなものを持っているでしょう

<?php
$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']); /*cleartext*/
$email    = mysql_real_escape_string($_POST['email']);

mail($email,"New account","Your username \"$username\" and your password is \"$password\"");

$salt ="sometext";
$escapedPW="userpass";
$saltedPW =  $escapedPW . $salt;
$hashedPW = hash('sha256', $saltedPW);

mysql_query("INSERT INTO users (username, password, email) VALUES ($username, $hashedPW, $email)")

いくつかの大まかなサンプルコード。お役に立てば幸いです。

7
Henrik Skogmo

プレーンテキストのパスワードを電子メールで送信しないでください。むしろ、コメントで提案されているように、期間限定の1回限りの「パスワードのリセット」リンクを送信してください。

@Henrikによって提案されているように、単純なハッシュを使用しないでください。標準の調整可能な作業パスワードKDF(PBKDF2、bcrypt、scrypt)を使用します

PHP 5.5を使用できる場合は、 標準のパスワードハッシュ関数 を使用してください。PHP 5.5をサポートするホストがありますが、それらを探してそれを求める必要があります。

それを正しく行う方法を説明するウェブ上の場所はたくさんあり(例: https://wiki.mozilla.org/WebAppSec/Secure_Coding_Guidelines#Authentication )、間違った方法を説明する場所もたくさんあります。独自の認証システムを導入する前に、これを調査するために少し時間を取ってください。

2
Terrel Shumway