我想要一个表单,其中用户可以更改密码。我能够加密一个密码,但是当它是从数据库中选择的(原始密码是'test')时,它不能识别它。
这是在db中加密密码的时候。我正在检查表单中键入的密码是否与数据库中的密码匹配:
SELECT * from table where password = md5('$typed_password')它是这样加密的:
UPDATE table set field = md5('$typed_password' )我的select如何工作,以便当用户在表单中键入它时,原始表单被识别?
发布于 2009-10-25 07:03:20
首先: MD5是一种cryptographic hash function,不一定是加密方法。哈希被设计为只在一个方向上执行,并且不能反转。(这是一件好事)
然而,MD5是加密破解的(不再被认为是安全的);您应该使用另一个散列函数(最好是Bcrypt-hash或至少是SHA256)
看一下代码,我可以看到几个错误的地方:
如果您的密码不是salted
$typed_password已正确清除,或者您正处于设置密码的最简单(也可能是最好)方法是使用标准库:,并确保使用CRYPT_BLOWFISH算法。
require('PasswordHash.php');
$pwdHasher = new PasswordHash(8, FALSE);
// $hash is what you would store in your database
$hash = $pwdHasher->HashPassword( $password );
// $hash would be the $hash stored in your database for this user
$checked = $pwdHasher->CheckPassword($password, $hash);
if ($checked) {
echo 'password correct';
} else {
echo 'wrong credentials';
}存储/检查/更新查询应该绑定到用户的Id:
// Insert query
$query = "INSERT INTO users VALUES({$userId}, '{$username}', '{$hash}')";
// Select query
$query = "SELECT hash FROM users WHERE userId = {$userId}";
// Update query
$query = "UPDATE users SET hash = '{$hash}' WHERE userId = {$userId}";然后,您应该使用parametrised queries,而不是直接将变量值传递给查询。
我意识到这是一次大量的信息,但如果你不想让你的脚本被几乎所有的程序员破解,那么学习这一点是至关重要的。
发布于 2009-10-25 07:06:59
为什么不用PHP加密密码,然后用INSERT加密已经加密的密码。
SELECT也是如此。
所以:
$enc_passwd = md($typed_password);
$sql = "SELECT * FROM table WHERE password = '$enc_passwd')";与UPDATE类似
(为什么不是INSERT呢?)
发布于 2009-10-25 07:33:55
A recent post on passwords我有点跑题了,我讲了很多。一个花边新闻:
一旦你对他们选择的密码感到满意,首先用PHP加密它,然后存储。下面的密码加密功能也不是我的想法,但解决了许多问题。PHP中的加密可防止共享服务器上的用户截获您未加密的密码。为每个用户添加一些不会改变的东西(我使用电子邮件,因为这是我的网站的用户名),并添加一个散列(SALT是我在每个网站上更改的一个短的常量字符串),增加了对攻击的抵抗力。因为盐位于密码中,并且密码可以是任意长度,所以几乎不可能用彩虹表来攻击它。或者,这也意味着人们不能更改他们的电子邮件,你也不能在不使每个人的密码无效的情况下更改密码。
function password_crypt($email,$toHash) {
$password = str_split($toHash,(strlen($toHash)/2)+1);
return hash('sha256', $email.$password[0].SALT.$password[1]);
}因此,在第一次以伪代码输入用户密码时:
define(SALT,'blah');
$hashed_password = password_crypt($email,$password);
INSERT INTO users (email,hashed_password) VALUES ($email,$hashed_password);然后在伪代码中检查后续登录:
define(SALT,'blah');
$user_hashed_password = password_crypt($_POST['username'],$_POST['password']);
SELECT email FROM users WHERE email = ? AND hashed_password = $user_hashed_password LIMIT 1如果返回一行,则为有效登录。
https://stackoverflow.com/questions/1619418
复制相似问题