加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP password_hash()与Postgres crypt()

发布时间:2020-12-13 16:52:07 所属栏目:PHP教程 来源:网络整理
导读:我使用Postgres 9.3数据库作为Web应用程序的后端.我使用 PHP 5.5.7连接到数据库并返回前端AJAX调用的JSON. 我正在尝试决定将用户身份验证逻辑放在何处. 我不是安全专家;但是,我熟悉PHP的新密码_ *()函数,我非常了解幕后发生的事情.我也熟悉Postgres Extensio
我使用Postgres 9.3数据库作为Web应用程序的后端.我使用 PHP 5.5.7连接到数据库并返回前端AJAX调用的JSON.

我正在尝试决定将用户身份验证逻辑放在何处.

我不是安全专家;但是,我熟悉PHP的新密码_ *()函数,我非常了解幕后发生的事情.我也熟悉Postgres Extension pgcrypto和相关的crypt()函数.

我的问题是,使用PHP或Postgres散列密码是否有意义?

我很好奇这些函数是如何不同的,所以我在PHP中创建了一个密码哈希,然后将它交给Postgres,看看Postgres是否使用相同的算法.给定相同的参数,与PHP相比,Postgres返回了不同的结果(不出意外,但有注意).

PHP

password_hash('password',PASSWORD_BCRYPT,["cost" => 15]);

输出:$2y $15 $o8JufrnVXoob2NKiEGx6.uI4O2D4VcaAmY7WtNq5zPFiJow4KohGu

Postgres的

SELECT '$2y$15$o8JufrnVXoob2NKiEGx6.uI4O2D4VcaAmY7WtNq5zPFiJow4KohGu' = crypt('password','$2y$15$o8JufrnVXoob2NKiEGx6.uI4O2D4VcaAmY7WtNq5zPFiJow4KohGu')

输出:false

PHP与Postgres

鉴于这些过程不同,我想知道一个是否比另一个更好?是安全还是更少?

其他一些想法:

我目前拥有存储在数据库中的所有逻辑(视图,函数,约束等),所以如果我需要使用不同的前端,我不必担心缺少逻辑.在PHP中计算密码哈希将有效地要求所有请求通过PHP来访问数据库.

另一方面,将逻辑放在数据库中可以让我灵活地使用其他连接选项;但是,所有Postgres查询都会被记录.由于复制中使用了WAL,我无法禁用日志.这似乎是一个很大的安全漏洞.

我在这里走在正确的轨道上吗?我错过了什么?

编辑

我只是看了another message thread并找到了更多信息.

>将逻辑放在Postgres中将需要数据库处理并执行散列操作.对于需要这些资源的其他用户和批处理作业来说,这将是一件坏事.
>哈希不仅会降低正常运行速度,还会使整个系统更容易受到DOS攻击.

我们带有负载平衡的简单Web服务器可以解决这两个问题

我再次走在正确的轨道上吗?我还缺少什么?

解决方法

有关版本2y和2a之间的区别,请参阅此主题及其中的各个链接:

https://security.stackexchange.com/questions/20541/insecure-versions-of-crypt-hashes

我的理解是PHP until v.5.3.8中的2a实现存在问题,但仅适用于包含非ascii字符的字符串.正如你所指出的那样,PgCrypto由于某种原因不会“说”2y,我认为它会遭遇如此严重的问题. (或许将此报告为错误?)

除了后者提出的要点之外,你在你的问题中确定了两者之间的主要安全差异:系统地对数据库中的密码进行哈希处理是方便的,但暗示你以明文形式将它发送到你的数据库,它可以(并且会如果您的数据库连接未加密,则记录 – 或直接窥探.

在一个理想的世界中,您甚至在发送到PHP之前使用javascript在客户端应用程序中对密码进行哈希处理.接下来最好的事情是使用SSL将其发送到PHP,然后使用PHP对其进行哈希处理,然后再将其发送到数据库.

旁白:如果由于某种原因需要互操作性,我很确定PHP的crypt可以生成(安全)2a版本哈希.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读