使用mcrypt,PHP和MySQL进行加密

时间:2011-04-22 16:55:56

标签: php mysql encryption mcrypt

我正在尝试使用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 个答案:

答案 0 :(得分: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
}

我并没有声称这是最安全的,它只是一个用盐进行哈希散列的小例子。

答案 1 :(得分: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);

我从以下网址获取此代码,并且我在我的应用程序中使用它。

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

答案 2 :(得分: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插入带有附加盐的用户密码。请记住,这只是将用户密码存储在数据库中的建议。

答案 3 :(得分:0)

同意对于您的特定用例(存储用户的密码),单向散列最好。

但对于真正需要使用mcrypt,PHP和MySQL的人,请参阅MySql insert binary data to db without errors中的各种选项。一个简单的选项是base64_encode / base64_decode - here's an example