Hash PDO准备语句中的散列和盐析

Hash PDO准备语句中的散列和盐析,hash,pdo,sha1,salt,Hash,Pdo,Sha1,Salt,有人能告诉我在PDO准备的语句中使用散列和盐析的正确格式吗?我正在从php转换过来,在担心更复杂的函数之前,我试图在一个简单的INSERT语句中实现这一点,但我在网上看到的一切都不起作用 在php中,我这样做:“.sha1($salt+$\u POST['password'])。” 我试过: $password = '123456'; $hash = hash('sha1', $password); $pass1 = hash('sha1', $salt . $hash . $password

有人能告诉我在PDO准备的语句中使用散列和盐析的正确格式吗?我正在从php转换过来,在担心更复杂的函数之前,我试图在一个简单的INSERT语句中实现这一点,但我在网上看到的一切都不起作用

在php中,我这样做:
“.sha1($salt+$\u 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();   

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

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

PHP5.5将有自己的函数
password\u hash()
password\u verify()
就绪,以简化BCrypt密码哈希的生成。我强烈建议使用这个优秀的api,或者它适用于早期的PHP版本。然后,我会邀请您阅读更多关于正确的密码存储与盐和胡椒在这篇文章

编辑:

通常,带有PDO的insert如下所示:

$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语句中参数化。

sha1
并不是哈希密码的好方法。更好的解决办法是使用。它不仅有点坏,而且是一个快速算法,因为明显的原因,它对散列密码非常糟糕。@PeeHaa:谢谢你提供的信息:-)我会考虑切换到bcrypt,但我更喜欢先让它工作(我发现如果我一次只切换一件事情,调试会更容易)。对基本INSERT语句的哈希和salt使用的正确格式有什么建议吗?所以我只使用这1行并在我的值中将其引用为$hash?我知道sha1不是最好的方法,在这之后,我可能会切换到更好的散列方法,但我首先希望使用PDO准备的语句(我发现,当我一次只更改一件事情时,调试更容易;-))我不太理解您刚才解释的PHP和SQL中字符串连接方式的不同之处。我尝试删除部分/所有引号和。甚至尝试删除“$salt+”,但没有效果。我目前正在使用salt的静态值(它存储在另一个安全的文件夹中)。最初的语句首先净化了密码,然后我在上面的代码的插入函数中添加了sha1和salt。您很慷慨,花时间询问了我的代码的其他方面,所以我想解释/澄清其中的一些内容:-)我目前正在使用salt的静态值(它存储在另一个安全的文件夹中)。在原始代码中,密码值被清除,然后在插入函数中添加了sha1和salt(使用上面的代码)。我不太明白您对PHP和SQL中字符串连接方式的解释。我尝试删除了部分/全部“。甚至完全删除了salt,但这些都没有帮助。@ChayaCooper-使用命名占位符,您的insert语句看起来像这样:
$sql='插入到用户(名称,密码哈希)值(:username,:password)“;
。然后你可以按照你的建议调用bindParam。@ChayaCooper-我想你是对的。唯一必须匹配的是VALUES
:fname
中的名称和bindParam
:fname'
中的名称。数据库的字段名在
插入到客户信息(fname…)中定义
也可以不同,从HTML表单中使用
$\u POST['fname']
得到的变量也可以不同。我不记得第一种方法是如何创建
$hashedPassword
对不起…,但无论如何都应该使用提到的库
password\u hash($password,password\u BCRYPT)来完成
,盐将自动创建。