sha256是否可以安全地用于我的网站登录页面,然后通过base64_encode对其进行加密? 我需要你的建议。 谢谢大家。
$username = $_POST['username'];
$password= $_POST['password'];
$sPassword= hash('sha256',$password);
$ePassword= base64_encode($sPassword);
$insertSQLQuery = $conn->query("INSERT INTO tbl_users (username,password)
VALUES ('$username ','$ePassword')");
答案 0 :(得分:3)
不需要使用hash()
方法,并且当PHP具有自己的内置函数来实现此目的时,创建您自己的哈希技术非常无意义。
password_hash()
和password_verify
。
暗指@David的回答。您还应该创建一个盐:在对哈希进行哈希处理之前,将其添加为密码的唯一“附加”,以确保进一步的安全性度量和数据完整性。对我们来说很幸运,当您为PHP提供预定义的password_hash()
算法时,PHP的内置函数PASSWORD_BCRYPT
会做到这一点。
仅供参考:@treyBake暗示您的查询可以进行SQL注入。利用准备好的语句并进行健全性检查!
if(
isset(($username = $_POST['username'])) &&
isset(($password = $_POST['password']))
) {
($con->prepare('INSERT INTO tbl_users (username, password) VALUES (? ,?)'))
->execute(array(
$username,
password_hash(base64_encode($password), PASSWORD_BCRYPT)
));
}
答案 1 :(得分:0)
这是如果您使用salt
。 sha256使用的算法只有一种,您可以加密字符串,但不能还原操作。问题在于,它存在数据库,其中包含大量可能的每个字符串的大量数据,并最多将12个字符加密到不同的密码系统中,并且您可以通过在几秒钟内查询数据库来获取原始字符串。这就是为什么您应该使用盐。
盐是预定义的长字符串,用作加密之前与您的密码连接的密钥。在@Jaquarh注释中,您应该为每个用户创建并存储不同的盐。例如,您可以生成一个随机字符串。 另外,您应该将数据绑定到查询中以防止SQL注入。
在您的代码中,可以通过以下方式使其更加安全:
$salt = substr(md5(rand()), 0, 20) //this will generate a 20 characters random string
$username = $_POST['username'];
$password= $_POST['password'].$salt;
$sPassword= hash('sha256',$password);
$ePassword= base64_encode($sPassword);
$insertSQLQuery = $conn->prepare("INSERT INTO tbl_users (username,password)
VALUES ('?','?')");
//You may want to validate your $username and $ePassword here
$insertSQLQuery->execute(array($username, $ePassword));
PD:请记住,例如,当用户登录时,您稍后将需要存储该盐以检查密码,您需要将盐添加到用户在登录表单中引入的密码中,然后再进行加密和查询数据库
答案 2 :(得分:0)
请发表评论! 关于:
$sPassword= hash('sha256',$password);
$ePassword= base64_encode($sPassword);
此构造没有任何意义。 hash('sha256',$password)
返回64个十六进制数字的字符串。 base64_encode()
将其最多炸成88个字符。两者都是人类可读的,因此没有用。
我的建议:要么使用$sPassword
(并跳过第二步),要么将代码更改为:
$sPassword= hash('sha256',$password,true);
// ^^^^^
$ePassword= base64_encode($sPassword);
在这种情况下,hash()
返回一个包含32个二进制字符的字符串,而base64_encode()
将其扩展为44个字符。小于64个十六进制数字。
无论如何:删除$username
可能的SQL注入。
答案 3 :(得分:0)
我正在使用这些方法。另外,您可以将$ key值更改为您喜欢的值。像我这样的。为了防止注入,请使用PDO
https://phpdelusions.net/pdo
function HeratHostEn( $q ) {
$key = "NazirAhmadHeratHost";
$cryptKey = 'qJB0rGtIn5UB1xG03efyCp'.$key;
$qEncoded = base64_encode( mcrypt_encrypt( MCRYPT_RIJNDAEL_256, md5($cryptKey), $q, MCRYPT_MODE_CBC, md5( md5( $cryptKey ) ) ) );
return( $qEncoded );
}
function HeratHostDe( $q ) {
$key = "NazirAhmadHeratHost";
$cryptKey = 'qJB0rGtIn5UB1xG03efyCp'.$key;
$qDecoded = rtrim( mcrypt_decrypt( MCRYPT_RIJNDAEL_256, md5( $cryptKey ), base64_decode( $q ), MCRYPT_MODE_CBC, md5( md5( $cryptKey ) ) ), "\0");
return( $qDecoded );
}