我试图使用加密在我的数据库上存储密码。首先,它是有效的,但只是在某些时候。
这是我的加密代码:
//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(加密密码),并使用用户名重新创建密钥。
这是有效的,但只是有时。我不知道为什么。我唯一的假设是数据库不能接受加密产生的一些字符,比如引号。
任何帮助都将非常感激!
$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
}
我并不是说这是最安全的,它只是一个用盐单向散列的小例子。
您可以尝试下面的代码进行2路加密。您可以根据您的需要加盐。
$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如果要在数据库中存储用户的密码,则应该使用单向散列
这是一个非常简单的例子
$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插入带有附加salt的用户密码。请记住,这只是在数据库中存储用户密码的建议。
同意对于您的特定用例(存储用户密码),单向散列是最好的。
但是对于那些真正需要使用加密,PHP和MySQL的人,请参阅MySQL中的各种选项,将二进制数据插入数据库而不会出错。一个简单的选择是base64_encode
/base64_decode
——这里有一个例子。