1

基本的な暗号化システムを作成することができたので、ユーザーが最初に私の Web サイトにサインアップすると、salt、md5、および sha1 を使用してパスワードがデータベースに安全に保存されます。

ユーザーがログインしているときに問題が発生し、同じ方法を使用しているにもかかわらず、データベースに送信される文字列 (パスワード) が異なります。以下に示します。

これは、salt 手法を使用して顧客をデータベースに追加する基本的な (今のところ) ページです。

require "dbconn.php";

$username = $_GET['username'];
$email = $_GET['email'];
$pass = $_GET['pwd1'];
$pass2 =$_GET['pwd2'];
$matching = 0;

if($pass == $pass2)
{
echo "<script type='text/javascript'> window.alert('Your details have been successfully          registered, please proceed to login with your new credentials!')</script>";
echo '<script>javascript:window.close();</script>';

$salt = sha1(md5($pass));
$pass = md5($pass.$salt);

$query = "INSERT INTO customer VALUES    ('".$username."','".$email."','".$pass."','face1.jpg')";   

繰り返しますが、これは私の基本的な (今のところ) ログイン ページで、同じソルト手法を使用しています (このページの後半部分は省いています)。

session_start();
require "dbconn.php";

$username = $_GET['username'];
$password = $_GET['password'];

$salt = sha1(md5($password));
$password = md5($password.$salt);

$sql = "SELECT * FROM customer WHERE username ='".$username."' AND   password='".$password."'";

私はいくつかのチェックを行い、パスワード名テストなどを使用してパスワードをデータベースに入れるとき: 34364c859afb02e70306c905374ac2 として保存されますが、ユーザーがログインするときのパスワードは: 34364c859afb02e70306c905374ac2d5 です。

4

4 に答える 4

4

ここにはたくさんの問題があります:

  1. URL 文字列 (GET パラメータ) でパスワードを送信しないでください。パスワードが表示され、リファラー URL を介してパスワードが漏洩する可能性があるためです。
  2. 準備済みステートメントを使用します。古い mysql_* 関数を使用しないでください。代わりに MySQLi または PDO を使用してください。データベースに送信するパラメーターはすべて、ステートメントが準備された後に挿入されたパラメーターを持つ 2 つのうちの 1 つを使用して、準備されたステートメントを介して送信する必要があります。これにより、MySQL ドライバーを使用してパラメーターをエスケープし、SQL インジェクションから保護することができます。
  3. スタイル的には、変数には一貫した名前を使用する必要があります。
  4. 列の長さを確認してください。それはおそらく短すぎる。(2文字欠落)
  5. あなたのソルティング方法は、元のパスワード文字列から派生したものであるため、実際にはソルティング方法とは言えません。ユーザーごとに一意のソルトを生成することを検討してください。
于 2013-03-20T15:32:40.403 に答える
2

ここにはいくつかの問題があります。

  1. 生のユーザー入力を使用して SQL クエリを作成しないでください。エスケープする必要があります。準備済みステートメントで PDO を使用することをお勧めします。
  2. パスワードをハッシュ/暗号化/保存する方法は、まったく安全ではありません。これを処理できる PHP ライブラリを試してください。より安全です。
  3. あなたの場合、問題はデータベースのフィールド長にあるようです。ご覧のとおり、提供した 2 つのハッシュはほとんど同じですが、最初のハッシュは 2 文字短いだけです。データベースパスワードフィールドの長さを拡張する必要があります。
于 2013-03-20T15:32:22.150 に答える
1

保存しているハッシュは MD5 ハッシュには短すぎます。長さは 30 文字です。

あなたはおそらくそれをトリミングしています。フィールドの長さを確認してください。ハッシュには 32 文字を収容する必要があります。

于 2013-03-20T15:31:40.737 に答える
1

文字列から 2 文字が抜けています。

34364c859afb02e70306c905374ac2
34364c859afb02e70306c905374ac2d5

mysql フィールドの長さを確認してください。

于 2013-03-20T15:33:32.030 に答える