PHP SHA256今天(2019年5月)安全吗?

时间:2019-05-14 10:14:48

标签: php sha256

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')");

4 个答案:

答案 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 );
}