simon_massey / thinbus-php-srp-demo
Thinbus SRP PHP 的演示:SRP-6a 安全远程密码协议的实现。
Requires
- php: ^5.6 || ^7.0
- simon_massey/thinbus-php-srp: ^1.8
Requires (Dev)
- phpunit/phpunit: ^6.4
This package is not auto-updated.
Last update: 2024-09-29 05:08:04 UTC
README
版权所有 (c) Simon Massey, 2015-2017
这是 SRP-6a 安全远程密码协议的 Thinbus SRP PHP 实现的演示。它演示了在浏览器中生成密码验证器,并将其保存到服务器上以用于用户认证。
注意 在尝试使用此演示代码之前,请先阅读 Thinbus 文档页面,该代码是从该项目的 JavaScript 中提取的,其中概述了一些最佳实践。
尝试演示
此演示允许您使用 PHP 版本测试库,并使用浏览器开发者工具检查 AJAX 流量。在尝试在服务器上部署之前,务必在您的工作站上以与服务器上完全相同的 php 版本本地测试!
# use the PHP composer to pull down the thinbus libraries: see package.json for how the version of thinbus PHP is specified # see https://composer.php.ac.cn/doc/01-basic-usage.md composer update # run all the unit tests to be sure that you have installed a version of the library that works with your PHP intall ./vendor/phpunit/phpunit/phpunit ./vendor/simon_massey/thinbus-php-srp/ThinbusTest.php # Run this in the same folder as the top level demo files php -S localhost:8000 # now open the demo in your browser which is running at https://:8000
注意,与 web 服务器运行 PHP 的方式相比,内置的 web 服务器非常慢。请参阅以下推荐。
演示应用程序
此作品基于 Ruslan Zazvacky 的 SRP PHP 演示,并将用户注册到 SQLite 数据库中。您不应该使用 SQLite 数据库,而应该使用主要应用程序的主数据库(如果您不想将临时状态放入主数据库,则可能还需要使用分布式缓存来存储认证期间创建的临时状态)。此演示非常人为,因为它只使用 AJAX 确认认证成功。在实际应用程序中,认证后浏览器应以传统方式(非 AJAX)加载主应用程序页面,以强制清除密码的任何痕迹,如 Thinbus 页面 上推荐的那样。演示还涵盖了授权(可以使用什么,哪些页面是公开的,哪些页面不是公开的)。
此演示将用户盐和验证器保存到位于 /tmp/srp_db.txt 的 SQLite 平文件数据库中。位置在 require.php 中配置,该文件还显示了 composer 安装 Thinbus PHP 库代码的位置。演示应用程序包含以下顶级 php 演示文件,您可能 不 希望在自己的应用程序中使用这些文件
require.php用于引入 SRP 常量、Thinbus 库、RedBean 库的片段。它还初始化 SQLite 数据库。rb.phpRedBeanPHP "一个易于使用的、动态的 PHP ORM",用于仅为了此演示的便利而抽象数据库。您不应在自己的应用程序中使用此库代码。register.php接受包含用户电子邮件、盐和验证器的 POST 请求,并将它们保存到 SQLite 数据库中。预计您将有自己的逻辑将数据保存到工业数据库中,而不是使用此代码。challenge.php接受包含用户邮箱的 POST 请求,在 SQLite 数据库中查找盐和验证器,并使用 Thinbus 核心库代码生成一次性服务器挑战。它将 Thinbus 对象保存在 SQLite 数据库的 'authentication' 表中,以便可以查找验证客户端密码证明所需的所有信息,该证明是通过使用一次性挑战由浏览器做出的。预期您不会使用我的 SQLite 示例代码,而是提供自己的代码以将数据保存在主数据库中。login.php验证用户密码证明。请注意,服务器需要记住它提供给客户端的一次性挑战,以检查一次性密码证明。因此,它将在 SQLite 数据库中查找创建一次性挑战的对象。预期您不会使用我的 SQLite 示例代码,而是提供自己的代码以将数据加载到主数据库中。然后,逻辑使用核心 Thinbus 库代码检查密码证明,如果认证失败,将抛出 PHP 异常。
预期您将创建自己的代码来加载和保存数据到真实数据库。不要使用我的 SQLite 或 RedBean 代码。在运行 composer update 时,仅使用 vendor 文件夹下安装的 PHP 文件。预期您将使用自己的代码来处理用户可以或不可以访问哪些页面的授权。尝试修改示例文件以支持您的应用程序可能比简单地修改您的当前应用程序以使用 thinbus\*.php 中的核心 Thinbus 库要困难得多。
请阅读 主要 thinbus 文档 中的建议,并采取额外步骤,例如使用 HTTPS 和加密数据库中的密码验证器,这些步骤在示例中未显示。
衷心感谢
由 Sauce Labs 提供,跨浏览器测试平台和开源 <3
使用 Sauce Labs 测试的演示应用程序代码 thinbus-php-srp-demo 已在以下浏览器上测试通过:
- Android 6.0
- Android 5.1
- Android 5.0
- Android 4.4
- iOS 11.0
- iOS 8.1
- Microsoft Edge 15
- Microsoft Edge 13
- Microsoft Explorer 11(注意所有之前版本已于 2016 年 1 月停止支持)
- Chrome 63
- Chrome 26
- Firefox 57
- Firefox 4(发布于 2011 年 3 月 22 日!)
- Safari 11
- Safari 7
故障排除
如果您遇到问题,首先请检查 PHP 单元代码是否在您的工作站上本地运行,使用与服务器上运行的完全相同的 PHP 版本。
composer update
# run the Thinbus unit tests which tests the cryptography
./vendor/phpunit/phpunit/phpunit --verbose ./vendor/simon_massey/thinbus-php-srp/ThinbusTest.php
如果所有测试都通过,则应输出类似于 OK (xx tests, yyy assertions) 的最终行。如果不是,请报告确切的 PHP 版本和 phpinfo(); 的输出。
接下来,在您的工作站上运行本地的 内置 web 服务器,并尝试注册然后进行认证(注意,成功的认证仅将 "Success" 写入登录页面的绿色横幅中)
# Run this in the same folder as the top level demo files
php -S localhost:8000
如果这不起作用,请尝试使用不同的浏览器(Chrome、Firefox、Edge/Safari)检查是否是浏览器JavaScript兼容性问题。使用您最喜欢的浏览器的开发者视图查看网络流量,看它是否与上面的图表相对应。在您提出的任何问题中提供浏览器流量的详细信息。然后提出问题,列出您测试的所有浏览器版本和结果。如果您使用浏览器开发者工具捕获网络流量(尤其是AJAX调用)来查看服务器是否将任何错误消息放入流量中,可能会破坏演示代码,则可加加分。包括任何浏览器JS控制台输出和任何PHP脚本引擎日志,这些可能表明问题的可能原因,则可获得额外加分。
如果您已经走到这一步,但无法找到本地运行演示代码的问题,那么下一个尝试是将演示代码部署到您的主Web服务器。您的Web服务器可能没有权限写入/tmp/srp_db.txt,请参阅上面的文档了解它在演示中是如何硬编码的,并更改它。如果演示在本地运行正常,但在主服务器上不工作,建议您使用浏览器开发者工具比较本地运行和主服务器上运行时的网络流量(尤其是AJAX调用),以查看服务器流量是否表明服务器配置问题。通常,来自服务器的AJAX响应会显示一个警告消息,浏览器无法解析。在提出问题之前,先尝试修复PHP警告消息,因为这通常是自定义PHP安装中缺少的东西。
如果PHP代码在您的服务器上运行得非常慢,那么很可能是您的服务器缺少PHP通常使用的某些本地库。在这种情况下,PHP引擎的运行速度比网络浏览器慢得多。这不是我可以为您调试的问题,所以请不要提出问题。相反,请在StackOverflow或另一个StackExchange网站上就您的操作系统和PHP版本提问,询问是否存在可以通过更改设置或安装本地库来修复的“已知问题”(典型的一个是安装OpenSSL及其使用的PHP库)。
许可证
Copyright 2015-2017 Simon Massey
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://apache.ac.cn/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
结束。