当前位置: 首页 > 知识库问答 >
问题:

散列密码注册/登录

上官联
2023-03-14

我在谷歌上搜索过正确的方法,但是有很多不同的方法。所以我想出了这个,不介意一些批评和更好实践的链接。

//注册表格-用户提供用户名(电子邮件)密码(文本)//

所以我抓取数据:

$user = mysql_real_escape_string($_POST['user']);
$pswd = mysql_real_escape_string($_POST['pass']);
$salt = hash( 'sha256', microtime() . rand() );
$encrypt = hash( 'sha256', $pswd . $salt );

然后将user_email| encrypted_pass|salt插入数据库

//登录表单-用户提供用户名(电子邮件)密码(文本)//

所以首先根据用户(电子邮件)我抓取encrypted_pass和盐信息。然后

$user = mysql_real_escape_string($_POST['user']);
$pswd = mysql_real_escape_string($_POST['pass']);

$encrypted_pass_fromDB = $var['encrypted_pass'];
$salt_fromDB = $var['salt'];

if (hash( 'sha256', $passwrd . $salt_fromDB) === $encrypted_pass_fromDB)
     {
      echo "GOT IT!";
     }

我读过bcrypt是一个更好的选择,但是现在我想更好地理解SALT方法。同样,当我使用$options = ['cost' =

任何意见都值得赞赏!谢谢!

共有3个答案

寇丰
2023-03-14

PHP现在提供了一种生成安全密码哈希的简单方法,我们应该使用它,看看函数password_hash()。

// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT);

// Check if the hash of the entered login password, matches the stored hash.
// The salt and the cost factor will be extracted from $existingHashFromDb.
$isPasswordCorrect = password_verify($password, $existingHashFromDb);

当然,了解盐是如何工作的(以及正确处理它有多难)是很好的,所以尝试一下,但要为你的生命系统使用上面的功能。

廉实
2023-03-14

您应该使用内置的crypt功能:

http://php.net/crypt

你有两个选择:

让PHP Crypt生成salt

$user = mysql_real_escape_string($_POST['user']);
$pswd = mysql_real_escape_string($_POST['pass']);

//Salt is generated automatically
$encrypt = crypt( $pswd );

自己生成盐

$user = mysql_real_escape_string($_POST['user']);
$pswd = mysql_real_escape_string($_POST['pass']);

//These are the settings for the salt (Separated so you can understand it)
$algorithm = "2a";
$length = "12";

//Start the salt by specifying the algorithm and length
$salt = "$" . $algorithm . "$" . $length . "$";

//Add on random salt and make base64 adjusted for bcrypt's version
$salt .= substr( str_replace( "+", ".", base64_encode( mcrypt_create_iv( 128, MCRYPT_DEV_URANDOM ) ) ), 0, 22 );

//Encrypt with your generated salt
$encrypt = crypt( $pswd, $salt );

验证它很容易:

if ( $encrypted_pass_fromDB_with_salt === crypt( $passwrd, $encrypted_pass_fromDB_with_salt ) ) echo "ok";
关学
2023-03-14

在向哈希值中添加盐时,唯一可以防止的就是使用称为“彩虹表”的大型预先计算哈希表。这些在很长一段时间内都不是一个主要问题,但因为:

    < li >包含扩展字符集的Rainbow表非常庞大,有些需要16GB以上的RAM来搜索。 < li >跨多台计算机进行并行化的强制破解,或者卸载到AWS等云服务,速度更快、成本更低,并且简单盐的添加几乎无关紧要。

更好的算法将密码散列数千次,并以加密的“适当”方式应用给定的salt,使其更难破解。然而,它们所基于的哈希算法(如SHA和MD5)被设计为小而快,并且对它们进行暴力破解需要大量的CPU时间,这是廉价且易于并行化的。

Bcrypt不同。它使用Blowfish算法,需要相对大量的RAM,这很昂贵,因此难以并行化。这就是为什么每个人都如此强烈地推荐它。

TL;DR Hashing比明文更好,salted比unsalted更好,bcrypt比几乎所有其他东西都好,所以frickin使用它。

 类似资料:
  • 我一直在阅读OWASP10,我遇到了存储信息的最佳实践。咸杂碎。在这里,您为每个密码生成一个随机的salt,并对其进行梳理、散列和存储。我的疑问是,如果salt是随机生成的,当用户键入密码时,如何对密码进行身份验证?salt是否与用户名一起保存?如果是这样,这种做法仍然是脆弱的。或者他们是怎么做到的?

  • 我正在尝试将用户从旧的Drupal6 CMS迁移到KeyCloak。我想迁移用户与他们的旧密码,然后分配一个“更新密码”要求的行动到他们的个人资料。 然而,迁移密码似乎有问题,因为我只能以散列形式访问它们。 null 有没有人有幸让这个功能发挥作用?

  • 下午好我自己在一个安全项目中工作。我在PHP中检查登录代码时遇到问题。我不知道为什么,但当我尝试与我创建的“数据库中的密码为纯文本”的用户登录时,它会说密码不正确。 其思想不是将密码转换为散列。我知道这是一个很大的安全风险,但显然我不会将其用于专业用途。我的目的是做安全测试。 check.php: 编辑我已经纠正了错误,但我仍然有问题的日志,出现一个menssage:"姓名或密码不正确!".在我的

  • 如果你已有幕布,直接登录即可。如果还没有账号,可以使用手机号码注册幕布账号,也可以通过QQ、微信直接注册并登录。 注:微信登录方式需要手机上安装有微信。 账号设置与绑定 登录幕布后,点左上角的头像或者轻按屏幕从左往右滑动,选择「应用设置 - 账号设置」。在这里可以修改头像和昵称,设置密码,绑定手机号码、微信、QQ账号。 注: 绑定手机后才可以设置账号密码,手机号即为账号。 解除绑定需要在电脑上登录

  • 在首页点击注册进入注册页面,你可以使用手机号码注册幕布账号,也可以通过QQ、微信账户直接创建账号并登录。 账号设置与绑定 登录幕布后,点击右上角处用户头像,在下拉菜单中选择「账号设置」。在这里可以修改头像和昵称,设置密码,绑定手机号码、微信、QQ账号,查看账号是否为高级版以及高级版到期时间。 注: 绑定手机后才可以设置账号密码,手机号即为账号。 解绑最后一个登录方式后,账号将无法登录,请注意将文档

  • 注册 / 登录 1.注册 注册入口: 访问 http://www.aikf.com/ 点击右上角注册按钮 输入注册手机号、图形验证码、手机验证码等进行注册 其他注册入口:手机登录http:/www.aikf.com/ 爱客服官方微信公众号注册:点击立即注册 2.登录 登录入口: 访问http://www.aikf.com/ 点击登录 输入用户名及登录密码,点击登录(见下图) 2.修改密码 在登录入