0

Android アプリケーションにパスワード変更機能を実装しており、php ファイルでパスワードハッシュをコーディングしました。ユーザーはパスワードを変更でき、パスワードはデータベースに保存されます。メールと新しいパスワードでログインしようとすると、間違ったパスワードが表示されます。私のphpファイルのどこが間違っていましたか?

これは私のphpファイルコードです:

<?php

// array for JSON response
$response = array();

function hashSSHA($newpassword) {
    $salt = mhash('sha512', rand());
    $salt = substr($salt, 0, 15);
    $encrypted = hash('sha512', $newpassword . $salt, true) . $salt;
    $hash = array("salt" => $salt, "encrypted" => $encrypted);
    return $hash;
}

// check for required fields
if (isset($_POST['email']) && isset($_POST['newpassword'])) {
    $email = $_POST['email'];
    $newpassword = $_POST['newpassword'];

    // include db connect class
    require_once __DIR__ . '/db_connect.php';

    // connecting to db
    $db = new DB_CONNECT();

    // TESTING HERE FOR STORING NEW PASSWORD INTO DATABASE
    $hash = hashSSHA($newpassword);
    $encrypted_password = $hash["encrypted"]; // encrypted password
    $salt = $hash["salt"]; // salt

    $result = mysql_query("UPDATE users SET encrypted_password = '$encrypted_password', salt = '$salt' WHERE email = '$email'");

    // check if row inserted or not
    if ($result) {
        // successfully updated
        $response["success"] = 1;
        $response["message"] = "Password successfully changed";

        // echoing JSON response
        echo json_encode($response);
    } else {
        $response["success"] = 0;
        $response["message"] = "Password change failed";
        echo json_encode($response);
    }
} else {
    // required field is missing
    $response["success"] = 0;
    $response["message"] = "Required field(s) is missing";

    // echoing JSON response
    echo json_encode($response);
}
?>

編集 これは私の復号化機能です

// DECRYPTING user currentpassword
function checkhashSSHA($salt, $currentpassword) {

$hash = hash('sha512', $currentpassword . $salt, true) . $salt;
return $hash;
} 
4

1 に答える 1

1

あなたのコードには非常に多くの問題があります。

まず第一に、SHA512 は速すぎるため、パスワードのハッシュには適していません。Bcryptは特にパスワードをハッシュするように設計されているため、低速です (計算時間が必要です)。phpassのような十分に確立されたライブラリを使用することをお勧めします。実装方法を理解したい場合は、最も重要な点を説明しようとしたこの記事を読むことができます。

1) コードの最初の問題はおそらくmhash()、salt のバイナリ出力を生成することです。パスワードハッシュに追加する理由はわかりませんが(ソルトを適用する方法ではありません)、変数$encryptedには後でバイナリデータが含まれます。

2) これは 2 番目の問題につながります。変数を update ステートメントに挿入します。SQL にバイナリ データを挿入すると、ステートメントが無効になります。SQL ステートメントにデータを追加する前に、常にデータをエスケープする必要がありますmysql_escape_string()

3) 次の問題は、mysql_* 関数が廃止され、代わりにデータベース アクセスに mysqli または PDO を使用することです。

4) 問題 2 で既に遭遇したもう 1 つの問題は、データをエスケープしないと、SQL インジェクション攻撃に対して脆弱になることです。このユーザー入力で誰かが何ができるか想像してみてください...

WHERE 電子メール = ' abc' OR email <> ''

...すべてのユーザーのパスワードを一度にリセットできた!

そうは言っても、Bcrypt の使用を再考することを強くお勧めします。

于 2012-09-06T20:08:15.093 に答える