我有一个基于 PHP 的 Web 应用程序,它将 HTTP 请求发送到 Java Web 服务,Java Web 服务反过来执行 Oracle 数据库中请求的操作。我想在 HTTP 请求中发送密码之前使用 password_hash 对我的密码进行哈希处理。如果我在创建新用户时这样做,那没有问题。但是,当我需要使用此密码登录时,我无法在 PHP 中验证它,因为我没有(也不能)直接访问数据库以获取存储在那里的哈希值。所以验证必须在 Java Web 服务中。那有可能吗?如果没有,还有什么选择?使用的盐是随机的,所以我不能散列用于登录的密码并发送它,因为我没有用于存储在数据库中的散列的盐。
1 回答
将您作为服务登录到Web服务上,在登录功能上添加一个检查,以便只有PHP服务器可以访问它(我假设整个服务只能由PHP服务器访问,这就是您将PHP服务器分开的原因首先)。必须不时刷新(ping)登录以使会话保持打开状态,服务上的所有操作都将检查此会话是否处于活动状态,如果您的 Web 服务仅在拉取时运行,则让 Java 代理关闭空闲连接/推。
您将不得不承担无聊的任务,即通过 php 将用户的登录信息传递到 Web 服务并完全在那里进行登录,然后在用户通过身份验证后返回 php 并开始服务。
如果这是安全风险(您甚至不希望 PHP 拥有密码的哈希值),那么您必须让用户自己登录到 Web 服务,然后联系您,验证用户是登录用户并启动服务。
至于哈希和盐,它们用于保护数据库上的加密数据不被窃取和读取。(以最简单的形式,保护信用卡号码)。盐可以是公开的,技术上也可以是散列,但你必须至少用 SSL 保护它,这样没有人可以使用它登录(或者如果你的用户发送了纯密码):P。普通密码 > hash ,然后添加 salt > salt 和存储到数据库的结果。
如果 PHP 中继登录数据,那么 PHP 可以保留会话,因为它通过 cookie+浏览器代理+ip 知道用户的身份(仍然需要与服务保持会话打开)。在用户直接登录 Web 服务的情况下,PHP 必须向 Web 服务请求该信息(如果可能,IP+浏览器代理)或请求一个会话令牌(由服务生成的字符串),该令牌必须由如果用户想要在令牌期间访问 PHP 服务器上的任何页面。