simon_massey / thinbus-php-srp
Thinbus SRP PHP是SRP-6a安全远程密码协议的实现。
Requires
- php: ^7.0
- paragonie/random_compat: ^2.0
- pear/math_biginteger: ^1.0
Requires (Dev)
- phpunit/phpunit: ^6.4
README
版权(c)Simon Massey,2015-2017
Thinbus SRP PHP是SRP-6a安全远程密码协议的实现。它还包括并随带Thinbus JavaScript SRP文件。由于此PHP包包含PHP客户端和服务器代码,您可以在PHP中生成临时密码的验证器,并使用浏览器通过JavaScript登录到PHP服务器。
此PHP库项目发布在Packagist。还有一个单独的仓库,其中演示了如何使用此库项目thinbus-php-srp-demo。
注意在尝试使用此库代码之前,请阅读Thinbus文档页面,因为那是随此PHP库一起提供的浏览器中运行的JavaScript的文档。还请在thinbus-php-srp-demo中运行演示项目,并使用浏览器开发者工具监视通过AJAX运行的SRP6a协议。
注意高性能PHP服务器默认有很多本地扩展,包括php-bcmath。如果您正在编译自己的PHP,您可能会发现Thinbus运行非常慢。它使用官方的Math_BigInteger类,该类尝试使用本地库,如php-bcmath或php-gmp。如果找不到这些库,它将以纯PHP形式执行非常大的整数运算,这对于密码学来说太慢,无法使用。要修复此问题,您需要安装快速数学PHP扩展之一。
注意要使用PHP composer,您需要诸如dom,mbstring,xml,xmlwriter,zip之类的PHP扩展(也不要忘记密码学数学的bcmath)。这些可能不是您的服务器默认安装的。您需要安装如php-zip php-xml php-mbstring之类的包(也不要忘记密码学数学的php-bcmath)。您如何构建、安装和启用这些取决于您的PHP设置。如果您查看Dockerfile,您可以看到我如何在centos7上安装并设置它们以支持php72。您还可以查看php5.6分支的docker文件,以了解我如何在debian上安装并设置它们。请不要问我有关您自己的发行版/版本的问题,因为我使用stackoverflow来解决这个问题,您也可以这样做。
安装依赖项并运行单元测试
使用php7+时
composer update
vendor/bin/phpunit --verbose test/ThinbusTest.php
使用php5.6时
tar vxf php56.tar
wget https://phar.phpunit.de/phpunit-5.7.phar
php phpunit-5.7.phar --verbose ThinbusTest.php
在https://packagist.org.cn/packages/simon_massey/thinbus-php-srp-demo处有一个使用此库的演示应用程序。这表明在运行composer update之后,thinbus php代码存储在vendor文件夹中,这是应用程序从中加载的位置。
在您的应用程序中使用
核心PHP库文件位于thinbus文件夹中
thinbus/thinbus-srp-config.phpSRP配置全局变量。必须在thinbus库代码之前包含。必须与JavaScript中配置的值匹配。thinbus/thinbus-srp.php基于Ruslan Zavacky的代码,实现了基于Java的Thinbus SRP服务器代码的PHP端口。thinbus/thinbus-srp-common.php客户端和服务器使用的通用函数。thinbus/thinbus-srp-client.php由Keith Wagner贡献的PHP客户端代码。
核心Thinbus JavaScript库文件位于resources/thinbus文件夹中
thinbus/rfc5054-safe-prime-config.js示例配置。有关如何创建自己的安全素数的说明,请参阅主thinbus文档。thinbus/thinbus-srp6a-sha256-versioned.js在主项目中测试的thinbus JS库。请参阅该文件中的标题,其中说明了版本号。
文件thinbus\thinbus-srp-config.php包含SRP常量,其形式如下
$SRP6CryptoParams = [
"N_base10" => "19502997308..."
"g_base10" => "2",
"k_base16" => "1a3d1769e1d..."
"H" => "sha256"
];
数字常量必须与JavaScript文件resource\thinbus\rfc5054-safe-prime-config.js中配置的值匹配;请参阅Thinbus文档。建议您使用openssl根据Thinbus说明创建自己的大安全素数值。
您需要了解的是
- 每个用户都有一个密码验证器和唯一的盐,您将其存储在数据库中。此实现使用RFC2945方法将用户名散列到密码验证器中。这意味着如果您的应用程序允许用户更改用户名,则除非您生成并存储新的密码验证器,否则用户将被锁定。
- 在每次登录尝试时,浏览器首先向服务器发出AJAX调用以获取一次性随机挑战和用户盐。然后浏览器使用这些信息来计算一次性密码证明,然后立即将密码证明发送到服务器。服务器使用存储在用户数据库中的信息检查一次性挑战的密码证明。这意味着服务器必须暂时保留生成挑战的thinbus对象(无论是您的首选缓存还是主数据库)。
以下图表显示了您需要了解的内容
预计您将创建自己的代码来加载和保存数据到真实的数据库中。不要使用我的示例应用程序的SQLLite或RedBean代码。仅使用此存储库中thinbus\*.php文件夹中的PHP文件。预计您将使用自己的代码来处理页面授权,即用户可以或不能访问哪些页面。尝试修改示例文件以支持您的应用程序可能比简单地修改当前应用程序以使用核心Thinbus库在thinbus\*.php中更难。
请阅读主thinbus文档中的建议,并采取额外步骤,例如使用HTTPS和在数据库中加密密码验证器,这些步骤在此示例中未显示。
注意:在PHP7中,随机数源现在是官方的string random_bytes ( int $length )。在PHP5.2+中,Thinbus使用polyfill库random_compat。请注意,PHP5.6和PHP7.0不再受到积极支持,但通过2018年仍在接收安全补丁。因此,您今天真的需要升级到PHP7.1+,以便在接下来的几年中获得安全补丁。请参阅https://php.ac.cn/supported-versions.php
故障排除
请注意,Thinbus使用的Math_BigInteger进行加密数学运算非常慢(可能挂起,或者可能使单元测试失败),除非安装了本地数学扩展。通常,高性能的PHP服务器安装都包含本地数学扩展。如果您发现Thinbus在您的托管环境中运行缓慢,请尝试安装“bcmath”(或“gmp”)。CI构建会运行由Dockerfile创建的镜像,该镜像基于Centos7,带有PHP7.2和php-bcmath,这提供了快速(本地)且精确的大整数数学运算,以便快速运行SRP加密数学。该镜像已发布在hub.docker.com,您可以在bitbucket-pipelines.yaml文件中查看详细信息。
如果您遇到问题,首先请检查PHP单元代码是否在您的工作站上使用与服务器上相同的PHP版本本地运行。
composer update
vendor/bin/phpunit --verbose ThinbusTest.php
如果所有测试都通过,则应输出类似“OK(xx测试,yyy断言)”的最终行。如果不通过,请提出问题,提供phpunit命令的详细输出以及系统上phpinfo();的输出。
如果您发现代码在服务器上运行缓慢,可能是由于pear/math_biginteger库找不到本地实现。如果可用,它将使用GMP或BCMath扩展,否则使用内部实现。解决方案是安装这些扩展之一,以便在本地速度而不是脚本速度下完成大数数学运算。
衷心感谢
跨浏览器测试平台和开源 <3 由 Sauce Labs 提供
使用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
许可
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.
结束。