0

mcrypt を使用してデータベースにパスワードを保存しようとしています。まず第一に、それは機能しますが、ごくたまにしかありません。

これが私の暗号化コードです:

    //Encryption/Decryption key
    $key = $username.$username.$username.$username.$username;
    //Encryption Algorithm
    $cipher_alg = MCRYPT_RIJNDAEL_256;

    $iv = mcrypt_create_iv(mcrypt_get_iv_size($cipher_alg, MCRYPT_MODE_ECB), MCRYPT_RAND);
    $password = mcrypt_encrypt($cipher_alg, $key, $pass1, MCRYPT_MODE_CBC, $iv);

これにより、$username、$iv、および $password が MySQL データベースにアップロードされます。

これが私の復号化コードです:

    //Encryption/Decryption key
    $key = $username.$username.$username.$username.$username;

    //Encryption Algorithm
    $cipher_alg = MCRYPT_RIJNDAEL_256;

    $dbpass = mcrypt_decrypt($cipher_alg, $key, $encpass, MCRYPT_MODE_CBC, $random);
    $dbpass = trim($dbpass); // Trim the fat

$username、$iv、および $encpass (暗号化されたパスワード) がデータベースから取得され、ユーザー名を使用してキーが再作成されます。

これは機能しますが、たまにしかありません。理由がわかりません。私の唯一の仮定は、引用符など、暗号化によって生成される文字の一部をデータベースが受け入れることができないということです。

どんな助けでも大歓迎です!

4

4 に答える 4

1

以下のコードで双方向暗号化を試すことができます。必要に応じて、パスワード付きのソルトを追加できます。

$key = 'ecryptionkey';
$string = 'password';

$encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, md5(md5($key))));   
$decrypted = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($encrypted), MCRYPT_MODE_CBC, md5(md5($key))), "\0");

var_dump($encrypted);
var_dump($decrypted);

以下の URL からこのコードを取得し、アプリケーションで使用しています。

https://stackoverflow.com/a/9262137/1724762

于 2013-05-29T04:40:22.267 に答える
1
$salt = time(); // I would use something other than time(), something more random

// store it in the db and redirect user
connect();
$query = mysql_query("INSERT INTO user VALUES
                      ('".mysql_real_escape_string($username)."',
                       '".mysql_real_escape_string(sha1($password . $salt))."',
                       '".mysql_real_escape_string($salt)."') ");

// returning user
$username = $_POST['username'];
$password = $_POST['password'];

// retrieve stored password
connect();
$result = mysql_query("SELECT * FROM user WHERE username = '".mysql_real_escape_string($username)."' ");
$row = mysql_fetch_assoc($result);
if (!$result) {
// user doesn't exist
}
$storedPassword = $row['password'];
$salt = $row['salt'];

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

if ($storedPassword != $hashedPassword) {
// exit
}
else {
// redirect user
}

これが最も安全であると主張しているわけではなく、ソルトを使用した一方向ハッシュのほんの一例にすぎません。

于 2011-04-22T18:04:07.720 に答える
0

特定のユース ケース (ユーザーのパスワードの保存) では、一方向ハッシュが最適であることに同意しました。

しかし、実際に mcrypt と PHP と MySQL を使用する必要がある人は、MySql のさまざまなオプションを参照してください。エラーなしでバイナリ データを db に挿入します。簡単なオプションの 1 つはbase64_encode/base64_decodeです。例を次に示します。

于 2012-02-02T17:25:56.603 に答える
0

ユーザーのパスワードをデータベースに保存する場合は、一方向ハッシュを使用する必要があります

これは非常に最小限の例です

$username = $_POST['username'];
$password = $_POST['password'];
$salt     = 'Some Salt';

$result = mysql_query("SELECT username, password
                       WHERE username = '".mysql_real_escape_string($username)."'
                       AND   password = '".mysql_real_escape_string(sha1($password . $salt))."'
                       LIMIT 1");

if(mysql_num_rows($result)) {
// we have a match
}
else {
// no match
}

私の例では、sha1を使用してソルトを追加してユーザーパスワードを挿入する必要があります。これは、ユーザー パスワードをデータベースに保存するための単なる提案であることに注意してください。

于 2011-04-22T16:59:27.487 に答える