0

有人可以告诉我在 PDO 准备好的语句中用于散列和加盐的正确格式吗?在担心更复杂的功能之前,我正在从 php 切换并尝试让它在一个简单的 INSERT 语句中工作,而我在网上看到的任何东西都没有奏效。

在 php 中,我正在这样做:'".sha1($salt + $_POST['password'])."'

我试过了:

$password = '123456'; 
$hash = hash('sha1', $password);
$pass1 = hash('sha1', $salt . $hash . $password);

$salt 在 config.php 中定义,正确引用,并在 php insert 语句中正常工作。

编辑 -

这是我正在使用的 INSERT 语句:

$stmt = $conn->prepare('INSERT INTO customer_info (fname...) VALUES(:fname...)');
$stmt->bindParam(':fname', $_POST['fname'], PDO::PARAM_STR);
$stmt->execute();   
4

1 回答 1

1

大多数数据库系统没有像样的密码散列函数可用,因此您无法使用 SQL 生成散列值。我不确定“从 PHP 切换”是什么意思,但让开发语言生成哈希,而不是数据库系统。

每个密码的盐应该不同,全局盐不能实现其目的。你的“盐”实际上是一把钥匙(或胡椒),它总是一样的。盐必须与散列值一起存储(明文),您需要将存储的散列与输入密码的散列进行比较。

PHP 5.5 将拥有自己的功能password_hash()password_verify()准备就绪,以简化生成 BCrypt 密码哈希。我强烈推荐使用这个优秀的 api,或者它是早期 PHP 版本的兼容包。然后我会邀请您在本教程中阅读更多关于使用盐和胡椒进行正确密码存储的信息。

编辑:

通常带有 PDO 的插入看起来像这样:

$password = $_POST['password'];
$hashedPassword = sha1($password . $salt);
$sql = 'INSERT INTO user (name, passwordhash) VALUES (?, ?)';
$sth = $pdo->prepare($sql);
$sth->execute(array('Jack Cornfield', $hashedPassword));

当然,您的陈述看起来会有所不同,但我不知道您的表格和字段。在示例中,散列的生成是在纯 PHP 中完成的,并将结果$hash参数化添加到带有占位符的 sql 语句中。

于 2012-12-12T09:06:58.150 回答