【问题标题】:Using Java to Verify a Password Hashed using password_hash in PHP使用 Java 在 PHP 中使用 password_hash 验证密码散列
【发布时间】:2015-06-03 05:38:28
【问题描述】:

我有一个基于 PHP 的 Web 应用程序,它将 HTTP 请求发送到 Java Web 服务,Java Web 服务反过来执行 Oracle 数据库中请求的操作。我想在 HTTP 请求中发送密码之前使用 password_hash 对我的密码进行哈希处理。如果我在创建新用户时这样做,那没有问题。但是,当我需要使用此密码登录时,我无法在 PHP 中验证它,因为我没有(也不能)直接访问数据库以获取存储在那里的哈希值。所以验证必须在 Java Web 服务中。那有可能吗?如果没有,还有什么选择?使用的盐是随机的,所以我不能散列用于登录的密码并发送它,因为我没有用于存储在数据库中的散列的盐。

【问题讨论】:

  • 所以在生产中你有一台带有 php 的服务器,另一台带有 java web 服务和数据库的服务器,对吧?
  • 很可能是的(尽管它们可以在同一台服务器上)。出于安全原因,“无法直接访问 PHP 中的数据库”部分是必需的。我们不能在 PHP 代码中包含数据库连接信息或语句。
  • 每个用户的每个盐都是随机的,但是为了验证登录,盐需要使用密码<random-salt><hashed-password>存储在数据库中。当我用户尝试登录时,用户名可用于从数据库中检索盐。 Web 服务和 PHP 应用程序之间的身份验证需要多条消息。 security.stackexchange.com/questions/33505/…security.stackexchange.com/questions/16325/…
  • 你能不能不使用 HTTPS 连接到 Java 服务,而只是转发用户名/密码,就像 PHP 脚本从用户那里收到它们一样...它们仍然是 SSL(嗯,TLS)加密它们在用户机器和 PHP 服务器之间的方式非常相似。

标签: java php hash password-hash php-password-hash


【解决方案1】:

将您作为服务登录到 Web 服务上,在登录功能上添加一个检查,以便只有 PHP 服务器可以访问它(我假设整个服务只能由 PHP 服务器访问,这就是您拥有PHP服务器首先分离)。必须每隔一段时间刷新一次(ping)登录才能使会话保持打开状态,服务上的所有操作都将检查此会话是否处于活动状态,如果您的 Web 服务仅在拉取时运行,则让 Java 代理关闭空闲连接/推。

您将不得不承担通过 php 将用户的登录信息中继到 Web 服务并完全在那里进行登录的无聊任务,然后在用户通过身份验证后返回 php 并开始服务。

如果这是安全风险(您甚至不希望 PHP 拥有密码的哈希值),那么您必须让用户自己登录到 Web 服务然后联系您,验证用户是登录用户并且启动服务。

对于哈希和盐,它们用于保护数据库上的加密数据不被窃取和读取。 (以最简单的形式,保护信用卡号码)。盐可以是公开的,技术上也可以是散列,但你必须至少用 SSL 保护它,这样没有人可以使用它登录(或者如果你的用户发送了纯密码):P。普通密码 > hash ,然后添加 salt > salt 和 result 都存储到数据库中。

如果 PHP 中继登录数据,那么 PHP 可以保留会话,因为它知道用户的身份与 cookie+浏览器代理+ip(仍然需要保持与服务的会话打开)。在用户直接登录 Web 服务的情况下,PHP 必须向 Web 服务请求该信息(如果可能,IP+浏览器代理)或请求一个会话令牌(由服务生成的字符串),该令牌必须由如果用户想要在令牌期间访问 PHP 服务器上的任何页面。

【讨论】:

    猜你喜欢
    • 2022-01-09
    • 2014-12-03
    • 2019-02-15
    • 1970-01-01
    • 2015-03-10
    相关资源
    最近更新 更多