1

データベース内のユーザーパスワードを更新するために、AndroidからいくつかのphpスクリプトへのHTTPPOSTを使用しています。

ユーザーがアカウントを作成し、データベースの更新が実行され、SALTの値が変更されたときに使用されるのと同じSALTハッシュを使用していますが、新しいパスワードでログインしようとすると、正しくないものとして表示されます。

パスワードを作成するための初期コードは次のとおりです。

public function storeUser($name, $email, $password, $rand) {
    $uuid = uniqid('', true);
    $hash = $this->hashSSHA($password);
    $encrypted_password = $hash["encrypted"]; // encrypted password
    $salt = $hash["salt"]; // salt
    $auth = 0;
    $result = mysql_query("INSERT INTO users(unique_id, authorized, auth_code, name, email, encrypted_password, salt, created_at) VALUES('$uuid', '$auth', '$rand', '$name', '$email', '$encrypted_password', '$salt', NOW())");
    // check for successful store
    if ($result) {
        // get user details 
        $uid = mysql_insert_id(); // last inserted id
        $result = mysql_query("SELECT * FROM users WHERE uid = $uid");
        // return user details
        return mysql_fetch_array($result);
    } else {
        return false;
    }
}

ハッシュ関数は次のとおりです。

 /**
 * Encrypting password
 * @param password
 * returns salt and encrypted password
 */
public function hashSSHA($password) {

    $salt = sha1(rand());
    $salt = substr($salt, 0, 10);
    $encrypted = base64_encode(sha1($password . $salt, true) . $salt);
    $hash = array("salt" => $salt, "encrypted" => $encrypted);
    return $hash;
}

/**
 * Decrypting password
 * @param salt, password
 * returns hash string
 */
public function checkhashSSHA($salt, $password) {

    $hash = base64_encode(sha1($password . $salt, true) . $salt);

    return $hash;
}

そして最後に、更新機能(問題がある場合):

 /**
 * Updating a users
 * password
 */
public function updatePassword($email, $password) {
    $uuid = uniqid('', true);
    $hash = $this->hashSSHA($password);
    $encrypted_password = $hash["encrypted"]; // encrypted password
    $salt = $hash["salt"]; // salt

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


    // check for successful store
    if ($result) {
        // get user details
        $uid = mysql_insert_id(); // last inserted id
        $result = mysql_query("SELECT * FROM users WHERE email = '$email'");
        // return user details
        return mysql_fetch_array($result);
    } else {
        return false;
    }
}

いつものようにどんな助けでも大歓迎です。

編集:

要求に応じたログイン機能:

 /**
 * Get user by email and password
 */
public function getUserByEmailAndPassword($email, $password) {
    $result = mysql_query("SELECT * FROM users WHERE email = '$email'") or die(mysql_error());
    // check for result
    $no_of_rows = mysql_num_rows($result);
    if ($no_of_rows > 0) {
        $result = mysql_fetch_array($result);
        $salt = $result['salt'];
        $encrypted_password = $result['encrypted_password'];
        $hash = $this->checkhashSSHA($salt, $password);
        // check for password equality
        if ($encrypted_password == $hash) {
            // user authentication details are correct
            return $result;
        }
    } else {
        // user not found
        return false;
    }
}
4

1 に答える 1

0

rand()ハッシュ関数として SHA1 の単一反復を使用し、ソルトが 10 文字に切り捨てられ、暗号的に安全でない関数で生成されるため、パスワードをハッシュするための弱いスキームを作成しました。次に、塩を別の畑に保管することで、生活を必要以上に困難にします。

あなたの場合、PHP の新しい関数password_hash()password_verify()を使用して強力な BCrypt ハッシュを取得することを強くお勧めします。それらは安全なランダムソルトの生成を処理し、結果の文字列にはハッシュ値とソルトが含まれているため、データベースの単一のフィールドに保存できます. 以前の PHP バージョン用の互換パックが存在します。

この関数を使用する最も簡単な方法は次のとおりです。

$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT);
$isPasswordCorrect = password_verify($password, $existingHashFromDb);

あなたの質問に答えるには: 機能しない明確な理由がわかりませんでした。多くの場合、問題はデータベース フィールドが短すぎることです。あなたの場合、10文字のソルトが追加されたバイナリSHA1、つまりbase64_encoded(必要なサイズを予測するのが難しい)の場所が必要です。また、SHA1 からのバイナリ文字列 (null バイト) を通常の文字列と組み合わせるのも危険です。

于 2013-02-26T10:17:28.807 に答える