- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在处理现有的 Symfony
2.8 网络应用程序项目,该项目使用 FOSUserBundle
进行用户身份验证。
除了 Web 前端,用户还可以使用不同的智能手机客户端通过 REST API 连接到 Web 应用程序。因此,用户在直接登录 Web 应用程序和连接 REST API 时都需要进行身份验证。
直到最新的 FOSUserBundle
更新了一个 bcrypt
密码散列和存储在数据库中的使用过的 salt
。
当使用 REST API 连接时,salt 被传输到客户端以使用相同的 salt 在本地散列密码。散列密码然后发送回网络应用程序进行身份验证。
我知道发送散列密码而不是纯文本不会增加(很多)额外的安全性,因为只能使用 HTTPS 进行通信。然而,这是客户端的工作方式:他们需要盐来生成散列密码。我可以在未来更新客户端,但现在这就是工作方式。
问题:他们以 FOSUserBundle
哈希的方式更改了密码:因为不手动指定 salt 而是让 PHP 自动生成 salt 被认为更省事(在 PHP 7 中,甚至无法手动设置盐),不再支持手动加盐。
直接登录 Web 应用程序时没有问题,但由于 REST 客户端仍然需要加盐,因此此更新会中断 REST 连接。
有什么方法可以结合这两种方法吗?让 PHP 自动创建盐,提取盐并将其发送给客户端?
据我所知,盐与散列存储在同一个字符串中:
但是,简单地从散列字符串中复制 21 个字符的盐并将其发送给客户端是行不通的。 这 21 个字符似乎足以测试/验证密码,但不足以重新创建哈希。这是正确的吗?
那么,有没有什么解决方案可以在不设置salt的情况下使用PHP password_hash
,同时了解使用的salt?
编辑 1:
回答@RiggsFolly 的问题:MD5 一直未被使用。这是不正确的,bcryp
/password_hash
不会两次创建相同的散列。如果密码和盐相同,它将这样做:
$s = 'password';
$salt = 'salt5678901234567890123456789012';
$options['salt'] = $salt;
$h1 = password_hash($s,PASSWORD_BCRYPT,$options);
$h2 = password_hash($s,PASSWORD_BCRYPT,$options);
echo $h1 . PHP_EOL;
echo $h2 . PHP_EOL;
结果:
$2y$10$salt56789012345678901uTWNlUnhu5K/xBrtKYTo7oDy8zMr/csu
$2y$10$salt56789012345678901uTWNlUnhu5K/xBrtKYTo7oDy8zMr/csu
如果未指定盐,
password_hash
将为相同的密码创建一个新的哈希值。这是因为,salt 将随机创建,这在每次调用时都会有所不同。
编辑 2:
正如在编辑 1 中看到的那样,使用 32 个字符的盐将导致字符串仅包含盐的前 21 个字符。但是,此盐前缀不能用于重新创建相同的哈希,因为它太短而无法被接受。
不过,如果前缀补0的话,貌似可以:
$s = 'password';
$salt = 'salt5678901234567890123456789012';
$salt_prefix = 'salt5678901234567890100000000000';
$h1 = password_hash($s, PASSWORD_BCRYPT, array('salt' => $salt));
$h2 = password_hash($s, PASSWORD_BCRYPT, array('salt' => $salt_prefix));
echo $h1 . PHP_EOL;
echo $h2 . PHP_EOL;
所以解决方案可能是:
FOSUserBundle
使用 password_hash
创建散列,无需 手动指定盐。谁能证实,这是一个真正的解决方案,而不仅仅是巧合?
最佳答案
您似乎误解了密码散列和盐分的工作原理。
盐永远不会发送给客户端。它仅在创建密码时生成(或手动指定)一次。其目的是随机化哈希函数的输出,以便当数据库落入坏人之手时,无法通过将输出与彩虹表进行比较来获取用户密码。
当用户使用他的密码登录时,密码从客户端发送到服务器,未经哈希处理(但通常通过 https)。密码比较函数然后获取存储的散列+密码,从中获取盐,将盐附加到用户输入,计算散列,然后将其与数据库中的散列进行比较。
也许您正在进行的项目对盐的实现不佳。事实上,不鼓励使用手动盐的原因之一是为了防止这样的事情发生。
So a solution could be:
let FOSUserBundle use password_hash to create the hash without manually specifying a salt.
extract the salt from the result string and pad it with 0 to a length of 32 chars
pass this salt to the client
Can anyone confirm, that this a real solution and not just some coincidence ?
这不是一个好的解决方案。唯一好的方法是确保以正确的方式实现密码散列,这样您就不必多次生成盐。
关于php - 了解盐是如何在 bcrypt password_hash 中生成/使用的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40991000/
密码散列的理想 bcrypt 工作因素是什么。 如果我使用因子 10,则在我的笔记本电脑上对密码进行哈希处理大约需要 0.1 秒。如果我们最终得到一个非常繁忙的网站,那么仅仅检查人们的密码就会变成大量
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 4年前关闭。 Improve thi
好吧,经过大量研究,我决定使用 bcrypt(请随意评论)在我的 PhoneGap 应用程序中散列和存储密码。 几天前,我偶然发现了 Bcrypt.net,它对我来说似乎“足够好”(再次,请随意发表评
我是 Ruby on Rails 的初学者,正在尝试向 http://ruby.railstutorial.org/ 学习我正在创建 example_app,但卡在了第 6 章。 我的Ruby版本:r
我是 Ruby on Rails 的初学者,正在努力学习 http://ruby.railstutorial.org/我正在创建 sample_app,但卡在了第 6 章。 我的 Ruby 版本:ru
我正在 Spring Hibernate MVC 中从事 Web 应用程序项目。我在 Spring security 中使用 Bcrypt 算法将编码密码存储在数据库中。 现在我想要解码该编码密码以停
我正在使用 sails js 框架来开发 Web 应用程序,并且我尝试安装 bcrypt 节点模块来进行密码哈希处理。但它显示以下错误 除了安装 python 或 VS c++ redistribut
我收到错误 Cannot find module 'bcrypt' in nodejs application 我尝试使用 npm install bcrypt 安装它,但仍然遇到问题 npm i b
我有一个 python 脚本,它将用户数据导入到 mongodb 中,该 mongodb 使用 bcrypt 来哈希用户的密码。 来自 mongodb 的数据也将在 Node.js Web 应用程序中
我想使用 Go 创建一个用户身份验证系统,但我无法登录帐户。我使用 bcrypt 来散列密码,然后将其保存到数据库 (MySQL)。当我想将它与插入的密码进行比较时,就会出现问题。我有这个错误:has
我尝试创建Minecraft 插件(这是我的第一个),但无法修复此错误: 因此,该插件编译良好,但是当代码必须执行此代码时: BCrypt.checkpw(mdp, result.getString(
嗨,我最近在我的项目中使用了 bcrypt npm 包的 bcrypt.genSalt 。使用 bcrypt.genSalt 的基本思想是为需要加密的密码生成 Salt。使用 bcrypt.genSa
这听起来像是一个奇怪的问题,我实际上不得不问这个感觉有点奇怪,但是在花了几个小时查看 MSDN 文档以了解添加的 bcrypt 例程之后在 Vista 中,我几乎得出结论,没有实际的 bcrypt 支
我想在我的 grails 项目中使用 bcrypt 散列算法,而不是它的 defaultSHA-256 消息摘要算法。要启用 bcrypt,您只需使用 grails install-plugin sp
关于bcrypt npm package ,我看到推荐使用异步版本。但是,我想真正了解两个版本在性能方面的差异(即事件循环、阻塞 I/O 等) 版本 1:异步 const hash = await b
我有一个问题,我可以在 node-bcrypt 和passport.js 中创建散列密码,但无法使用散列密码。 我使用 nodejs、express、mongodb、mongoose、passport
我目前正在尝试在我的 Spring Security 中使用 LDAP 实现 BCrypt。我的问题是 LDAP 是否支持此功能,如果支持,我该如何实现?查看下图,我没有将 BCrypt 视为 LDA
我创建了一个新的 Lumen 5.4 项目并尝试播种一些数据。在播种机中,我使用 bcrypt 来散列密码。但是当我运行 php artisan db:seed 时,我得到了这个错误: Call to
当我将 has_secure_password 添加到模型(继承自 ActiveRecord::Base)时,出现错误,指出“bcrypt-ruby 不是 bundle 的一部分”。 这里的日志是:
请帮我弄清楚为什么我无法在运行 ubuntu 14.04 的系统中安装 bcrypt 错误: somehostname@somehost:~$ pip install bcyrpt Collectin
我是一名优秀的程序员,十分优秀!