web-dev-qa-db-ja.com

php5.3.0でsha256を使用する方法

パスワードを暗号化するためにsha256を使用しています。 mysqlにsha256暗号化パスワードを保存できます。しかし、私は同じ条項でログインすることはできません。

コードを挿入:

<?php
error_reporting(E_ALL ^ E_NOTICE);
$username = $_POST['uusername'];
$passcode = $_POST['ppasscode'];
$userflag = $_POST['uuserflag'];
//$passcodeen = hash('sha256',$passcode);
$passcodeen = hash('sha256', (get_magic_quotes_gpc() ? stripslashes($ppasscode) : $ppasscode));
$conn = mysql_connect("localhost","charles","charles") or die("connection failed with DB:".mysql_error());
mysql_select_db("sessiondb");
$query = "INSERT INTO users(username,passcode,userflag) values('$username','$passcodeen','$userflag')";

コードを選択:

<?php 
error_reporting(E_ALL ^ E_NOTICE);

    @mysql_connect("localhost","charles","charles") or die("Connection failed".mysql_error());
    @mysql_select_db("sessiondb") or die("Database doesn't exist".mysql_error());
    //get user input
    $username = $_POST['username'];
    $ppasscode = $_POST['ppasscode'];
    //$passcodeen = hash('sha256', $ppasscode);
    $passcodeen = hash('sha256', (get_magic_quotes_gpc() ? stripslashes($ppasscode) : $ppasscode));
    //get session value from mysql
    $query = @mysql_query("select username, userflag from users where username ='$username' and passcode = '$passcodeen'") or die("Query execution failed".mysql_error());

何か問題はありますか?私はとても混乱しています。ありがとう。

37
Jiangong SUN

これはタイプミスでしょうか? (ppasscodeの2つのP、意図?)

$_POST['ppasscode'];

私は確認して行います:

print_r($_POST);

データがそこに正確であることを確認し、それがどのように見えるかをエコーアウトします:

echo hash('sha256', $_POST['ppasscode']);

この出力をデータベースにあるものと(手動で)比較します。これを行うことにより、失敗の可能性のあるポイントを探索しています。

  1. フォームからパスワードを取得する
  2. パスワードをハッシュする
  3. 保存されたパスワード
  4. 2つの比較。
59
Jeremy Morgan

まず、sha256は暗号化の一種ではなく、ハッシュアルゴリズムです。暗号化には、情報を元の値に復号化する方法が必要です(衝突は別として)。

あなたのコードを見ると、正しいパラメーターを提供していれば動作するはずです。

  • 最初にコードでリテラル文字列を使用してみて、$_POST[]変数を使用する代わりにその有効性を確認してください

  • データベースクエリからコードに比較を移動してみてください(指定されたユーザーのハッシュを取得し、計算したばかりのハッシュと比較します)

しかし、最も重要なことは、これをあらゆる種類の公的な方法で展開する前に、入力を完全に削除することを忘れないでください。任意のSQLをクエリに挿入できないようにします。ここでの最良のアイデアは、パラメーター化されたクエリを使用することです。

11
Yannick Motton

パスワードの保護には http://en.wikipedia.org/wiki/Bcrypt のような適応型ハッシュを使用する必要があります

1
Edwin M

最初のことは、 SHAの機能の比較 を作成し、プログラミング言語(PHP)をサポートする最も安全なアルゴリズムを選択することです。

次に、公式ドキュメントを噛んで、選択したハッシュアルゴリズムと生のパスワードを引数として受け取る hash() 関数を実装できます。

sha256 => 64 bitssha384 => 96 bitssha512 => 128 bits

ハッシュアルゴリズムのセキュリティが高いほど、ハッシュとサーバー側から元の値を回復する時間の点でコストが高くなります。

$hashedPassword = hash('sha256', $password);
1
CORONEL Braian

より良い解決策は、Anthony Ferraraの優れた互換性スクリプトを使用することです。

https://github.com/ircmaxell/password_compat

また、パスワードを確認するときは、必要に応じてハッシュを更新する方法を常に追加してください(非同期が望ましいので、タイミング攻撃のチェックプロセスに影響を与えません)。

0
Luis Ferro