php sha256今天(2019年5月)安全吗?

php sha256今天(2019年5月)安全吗?,php,sha256,Php,Sha256,在我的网站的登录页面中使用sha256安全吗?然后用base64_编码对其进行加密? 我需要你的建议。 谢谢大家 $username = $_POST['username']; $password= $_POST['password']; $sPassword= hash('sha256',$password); $ePassword= base64_encode($sPassword); $insertSQLQuery = $conn->que

在我的网站的登录页面中使用sha256安全吗?然后用base64_编码对其进行加密? 我需要你的建议。 谢谢大家

    $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')");
如果你用盐的话。sha256使用的算法只有一种方式,您可以对字符串进行加密,但无法还原操作。问题是,它存在的数据库中,每种可能的字符串都有多达12个字符的大量数据被加密到不同的密码系统中,您可以通过在几秒钟内查询数据库来获得原始字符串。这就是为什么你应该用盐

salt是一个预定义的长字符串,在加密之前用作密码的密钥。作为@Jaquarh注释,您应该为每个用户创建并存储不同的salt。例如,您可以生成一个随机字符串。 此外,还应使用数据绑定到查询以防止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:请记住,您需要存储该salt,以便在用户稍后登录时检查密码。例如,在加密和查询数据库之前,您需要将salt添加到用户在登录表单中引入的密码中。sha256使用的算法只有一种方式,您可以对字符串进行加密,但无法还原操作。问题是,它存在的数据库中,每种可能的字符串都有多达12个字符的大量数据被加密到不同的密码系统中,您可以通过在几秒钟内查询数据库来获得原始字符串。这就是为什么你应该用盐

salt是一个预定义的长字符串,在加密之前用作密码的密钥。作为@Jaquarh注释,您应该为每个用户创建并存储不同的salt。例如,您可以生成一个随机字符串。 此外,还应使用数据绑定到查询以防止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:请记住,您需要存储该salt,以便稍后在用户登录时检查密码,例如,在加密和查询数据库之前,您需要将salt添加到用户在登录表单中引入的密码中

不需要使用散列方法,当PHP有自己的内置函数来实现这一点时,创建自己的散列技术是毫无意义的

暗指大卫的回答。您还应该创建一个salt:它是在散列密码之前添加到密码中的唯一内容,以确保进一步的安全度量和数据完整性。幸运的是,PHP的内置函数password_hash在提供预定义的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)
         ));
}

不需要使用散列方法,当PHP有自己的内置函数来实现这一点时,创建自己的散列技术是毫无意义的

暗指大卫的回答。您还应该创建一个salt:它是在散列密码之前添加到密码中的唯一内容,以确保进一步的安全度量和数据完整性。幸运的是,PHP的内置函数password_hash在提供预定义的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)
         ));
}
请大耳朵评论! 关于:

这种构造毫无意义。散列'sha256',$password返回一个由64个十六进制数字组成的字符串。base64_编码将其放大到88个字符。两者都是人类可读的,因此毫无用处

我的建议是:要么使用$sPassword并跳过第二步,要么将代码更改为:

$sPassword= hash('sha256',$password,true);
//                                 ^^^^^
$ePassword= base64_encode($sPassword);
在本例中,hash返回一个包含32个二进制字符的字符串,base64_encode将其放大到44个字符。这比64个十六进制数字小

无论如何:删除$username可能的SQL注入。

以获取评论! 关于:

这种构造毫无意义。散列'sha256',$password返回一个由64个十六进制数字组成的字符串。base64_编码将其放大到88个字符。两者都是人类可读的,因此毫无用处

我的建议是:要么使用$sPassword并跳过第二步,要么将代码更改为:

$sPassword= hash('sha256',$password,true);
//                                 ^^^^^
$ePassword= base64_encode($sPassword);
在本例中,hash返回一个包含32个二进制字符的字符串,base64_encode将其放大到44个字符。这比64个十六进制数字小


无论如何:删除$username可能的SQL注入。

我正在使用这些方法。此外,您还可以将$key值更改为您喜爱的值。像我一样。为了防止注射使用PDO


我正在使用这些方法。此外,您还可以将$key值更改为您喜爱的值。像我一样。为了防止注射使用PDO


它比你的代码更安全。。您对SQL注入持开放态度,应该解决imm问题
为什么不使用内置的php函数?“密码散列和密码验证”更能说明问题。即使是这样也不安全!它比你的代码更安全。。您对SQL注入持开放态度,应该立即解决为什么不使用内置php函数的问题?“密码散列和密码验证”更能说明问题。即使是这样也不安全!牢不可破是一个大胆的说法,盐应该是每个用户的独特,而不是用户的独特application@Jaquarh现在答案应该更完整了md5不好,它完成了答案是的,但是你答案的整个概念只是一个不好的方法。。我不能强调不要发明自己的加密的重要性,除非你知道自己在做什么。使用bcrypt、scrypt或您喜欢的任何一种不易碎的盐都是一个大胆的说法,盐应该对每个用户都是唯一的,而不是对用户application@Jaquarh现在答案应该更完整了md5不好,它完成了答案是的,但是你答案的整个概念只是一个不好的方法。。我不能强调不要发明自己的加密的重要性,除非你知道自己在做什么。使用bcrypt、scrypt或您喜欢的任何一种