PHP 项目的用户密码设计

PHP 项目的用户密码设计
Photo by Towfiqu barbhuiya / Unsplash

简单聊一聊用户系统的密码存储设计

历史变迁

首先,最开始大家用的都是明文存储用户的密码,想着,反正存储在服务端,也只有服务端看得到,

但这些年这么多脱裤事件,终于意识到不能再使用明文了,

于是,大家改用 md5 等哈希算法,为用户密码“加密”,但数据库泄漏后,仍然可以使用 字典攻击 破解。字典攻击 是用一个字典文件,储存了单词、短语、常用密码和他们 hash 后结果。将密码与 hash 结果对比,就能破解。

为了解决这个问题,研发工程师又在密码的hash的过程中加 salt, salt是一串随机值,与 hash 后的密码一起保存在数据库。  这恐怕只能使用暴力破解了,但现在GPU的发展,使得暴力破解成为可能,如果被脱裤,则更容易破解。

同时期的 GPU 的计算单元比CPU多, L1/L2/L3缓存和控制器较少, 所以GPU非常适合做并行且无需内存参与的计算任务。

解决方案

PHP 5.5 开始, 针对于 password, 给出了轻便的解决方案:password_hash(加密)、 password_verify(验证校验)、 password_need_rehash(判断是否需要重新加密);

这一套password解决方案,首先是把 salt 值体现到了 hash 值里面,这样就不需要在维护一个 salt 字段,再者支持了 BCRYPT, ARGON 算法。

BCRYPT 这个算法,相比md5 是一个慢速hash,比较消耗cpu, md5 毫秒级别, bcrypt  0.1 秒级别 ;我们一直想让代码运行的快点再快点,而加密算法反其道而行。

针对这个算法, 并且可以设置 cost,来调整耗时,假设后续机器性能大提升,也可以修改 cost;

上文也提到了,GPU等硬件升级会导致破解速度的加快。

第二种算法,在2015年密码hash竞赛中诞生,并且拿了冠军, 那就是 argon2, 这种算法使用大量内存和大量计算资源进行 Hash 计算, 内存和GPU的数据传输是很慢的(不展开讲),  可能就是 0.2 s 的级别。可以设置 memory_costtime_cost **两种 cost 来调整运算的耗时。

扩展

argon 有3个分支,详细可以线下去了解: PHP 版本 7.2+

  • Argon2d:更快,使用 data-dependent 的内存访问方式,data 是需要 Hash 的 password 和 salt。适合加密货币和不会收到 side-channel timing 攻击的应用。
  • Argon2i:使用 data-independent 的内存访问方式,更适合密码哈希等。他比 Argon2d 慢,因为它需要更多次内存计算(passes)来保护免受 tradeoff 的攻击。
  • Argon2id:是 Argon2i 和 Argon2d 的混合版本,第一次计算用 Argon2i,后续的计算用 Argon2d。如果没有特定的理由,推荐使用 Argon2id。

Argon 需要 安装 sodium 扩展

Read more

Git hook 开发和实践,提升自动化效率

Git hook 开发和实践,提升自动化效率

我们使用 git 进行版本控制,期间会触发很多事件,这些利用好这些事件做好自动化,能帮我提升效率。git hook 就是一个这样的工具,在特定的事件中执行特定的钩子。 ╰─➤ ls .git/hooks applypatch-msg.sample post-update.sample pre-merge-commit.sample pre-receive.sample update.sample commit-msg.sample pre-applypatch.sample pre-push.sample prepare-commit-msg.sample fsmonitor-watchman.sample pre-commit.sample pre-rebase.sample push-to-checkout.sample 设置钩子路径 git 仓库的钩子存放路径由 core.hooksPath 控制,默认是在项目的 .git/hooks。它不能使用版本控制

By brian

MacOS 安装了最新版 Docker,命令行找不到了?

它藏在 /Applications/Docker.app 中,可以使用 find 命令查看: $cd /Applications/Docker.app $find . -name "docker" ./Contents/Resources/bin/docker 将 bin 目录拼接到 PATH 环境变量即可,一般可以追加到 ~/.bashrc ~/.zshrc 中。 export PATH=/Applications/Docker.app/Contents/Resources/bin:$PATH source ~/.zshrc 使环境变量生效,执行 docker 检查版本 $ source ~/.zshrc $ docker --version Docker

By brian
飞书集成平台 x Grafana:打造监控告警系统全攻略

飞书集成平台 x Grafana:打造监控告警系统全攻略

Grafana告警内容设置 告警内容分为:告警标题、告警说明、告警详情。告警标题和告警说明用来描述告警的规则。告警详情,描述告警的规则和具体的值。 告警详情 Description 设置 1. 打印所有的标签 {{ $labels }} alertname=High CPU usage, grafana_folder=CPU alerts, instance=server1 2. 自定义格式化打印所有的标签 {{ range $k, $v := $labels -}} {{ $k }}={{ $v }} {{ end }} alertname=High CPU usage grafana_folder=CPU alerts instance=server1 3. 打印单个标签 The host {{ index $labels

By brian
沪ICP备2022013452号-1