首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >php加密sql

php加密sql
EN

Stack Overflow用户
提问于 2009-10-25 06:52:21
回答 3查看 1.7K关注 0票数 2

我想要一个表单,其中用户可以更改密码。我能够加密一个密码,但是当它是从数据库中选择的(原始密码是'test')时,它不能识别它。

这是在db中加密密码的时候。我正在检查表单中键入的密码是否与数据库中的密码匹配:

代码语言:javascript
复制
SELECT * from table where password = md5('$typed_password')

它是这样加密的:

代码语言:javascript
复制
UPDATE table set field = md5('$typed_password' )

我的select如何工作,以便当用户在表单中键入它时,原始表单被识别?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-10-25 07:03:20

首先: MD5是一种cryptographic hash function,不一定是加密方法。哈希被设计为只在一个方向上执行,并且不能反转。(这是一件好事)

然而,MD5是加密破解的(不再被认为是安全的);您应该使用另一个散列函数(最好是Bcrypt-hash或至少是SHA256)

看一下代码,我可以看到几个错误的地方:

如果您的密码不是salted

  • I,真的希望$typed_password已正确清除,或者您正处于
  1. 中,请尝试使用相同的密码选择表中的所有用户。

设置密码的最简单(也可能是最好)方法是使用标准库:,并确保使用CRYPT_BLOWFISH算法。

代码语言:javascript
复制
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:

代码语言:javascript
复制
// 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,而不是直接将变量值传递给查询。

我意识到这是一次大量的信息,但如果你不想让你的脚本被几乎所有的程序员破解,那么学习这一点是至关重要的。

票数 4
EN

Stack Overflow用户

发布于 2009-10-25 07:06:59

为什么不用PHP加密密码,然后用INSERT加密已经加密的密码。

SELECT也是如此。

所以:

代码语言:javascript
复制
$enc_passwd = md($typed_password);
$sql = "SELECT * FROM table WHERE password = '$enc_passwd')";

UPDATE类似

(为什么不是INSERT呢?)

票数 1
EN

Stack Overflow用户

发布于 2009-10-25 07:33:55

A recent post on passwords我有点跑题了,我讲了很多。一个花边新闻:

一旦你对他们选择的密码感到满意,首先用PHP加密它,然后存储。下面的密码加密功能也不是我的想法,但解决了许多问题。PHP中的加密可防止共享服务器上的用户截获您未加密的密码。为每个用户添加一些不会改变的东西(我使用电子邮件,因为这是我的网站的用户名),并添加一个散列(SALT是我在每个网站上更改的一个短的常量字符串),增加了对攻击的抵抗力。因为盐位于密码中,并且密码可以是任意长度,所以几乎不可能用彩虹表来攻击它。或者,这也意味着人们不能更改他们的电子邮件,你也不能在不使每个人的密码无效的情况下更改密码。

代码语言:javascript
复制
function password_crypt($email,$toHash) {
   $password = str_split($toHash,(strlen($toHash)/2)+1);
   return hash('sha256', $email.$password[0].SALT.$password[1]); 
}

因此,在第一次以伪代码输入用户密码时:

代码语言:javascript
复制
define(SALT,'blah');
$hashed_password = password_crypt($email,$password);
INSERT INTO users (email,hashed_password) VALUES ($email,$hashed_password);

然后在伪代码中检查后续登录:

代码语言:javascript
复制
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

如果返回一行,则为有效登录。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1619418

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档