bolt / passwordlib
密码散列库
This package is auto-updated.
Last update: 2024-08-25 07:36:10 UTC
README
版本
这个版本与原始的 passwordlib/passwordlib
完全相同,只是被打上了 '稳定' 标签,因为 六年的 测试应该足够了。
关于
PHP-PasswordLib 旨在成为满足所有加密需求的综合性加密库。它旨在易于安装和使用,同时足够灵活和强大,即使是经验丰富的开发者也可以使用。
安装
composer require bolt/passwordlib
Composer
将以下内容添加到项目的 composer.json
文件中
{
"require": {
"PasswordLib/PasswordLib": "*"
}
}
然后,在该文件夹内,只需运行 php composer.phar install
。
然后,在您的代码中,只需使用 composer 自动加载器
require_once 'vendor/.composer/autoload.php';
就是这样!
用法
大多数用例可以直接使用根 PasswordLib
类。
$lib = new PasswordLib\PasswordLib();
$hash = $lib->createPasswordHash($password);
$boolean = $lib->verifyPasswordHash($password, $hash);
默认情况下,createPasswordHash
将创建一个 blowfish 散列,这是最安全的。要创建其他类型的散列,只需将类型的前缀作为第二个参数传递。
因此,要创建 Drupal 散列
$hash = $lib->createPasswordHash($password, '$S$');
或者要创建 SHA512 散列
$hash = $lib->createPasswordHash($password, '$6$');
它将自动创建一个安全的盐,并生成散列。
您也可以指定散列的选项。例如,要使用 bcrypt 的成本为 12
$hash = $lib->createPasswordHash($password, '$2a$', array('cost' => 12));
verifyPasswordHash
将尝试确定传入的散列类型。因此,一个 API 调用可以验证多种类型的散列。这使得应用程序可以便携,并通过一个 API 对多个数据库进行身份验证。
PasswordLib
类还有其他 API 方法用于获取随机数据。其中两个特别有用的是 getRandomNumber
和 getRandomToken
。
-
getRandomNumber([$min] [, $max]
- 获取给定参数之间的一个安全随机整数。 -
getRandomToken($size)
使用 base64 字符(a-zA-Z0-9./
)返回一个随机字符串。这用于生成 nonce 和发送到客户端的令牌。
库还包含其他用于生成随机数据和散列数据的方法,所以请四处看看!
设计目标
-
100% 可移植
这意味着没有对扩展或非标准服务器配置的强制(即必需)依赖。某些配置将提高某些功能的性能,但所有配置都应得到支持。
-
设计良好
代码将使用行业标准的设计模式,并遵循编写清洁和可测试代码的指南。
-
测试良好
这意味着代码应该被单元测试很好地覆盖。除了单元测试之外,还应运行标准测试向量,以确保算法的自定义实现具有正确的行为。
-
易于安装
PHP-PasswordLib 将支持三种安装方法。第一种是基于 pear 的安装器。第二种是一个单文件 PHAR 存档。第三种是通过 Composer 支持。
-
易于使用
该系统的目标之一是提供一个简单的接口,该接口具有安全的默认值,用于标准加密需求(随机令牌生成、密码散列和验证等)。如果需要更多功能,则可以通过额外的抽象层以所需的方式连接。
-
易于扩展
库应该非常易于扩展和添加新功能。
特性
可选自动加载
如果您通过 PHAR 包包含 PasswordLib,它将自动为您加载所有类,无需额外步骤。只需
require 'path/to/PasswordLib.phar';
如果您通过文件系统安装包含 PasswordLib,您可以使用内部自动加载器,通过加载 bootstrap.php 文件或加载 PasswordLib.php 文件来实现
require_once 'path/to/PasswordLib/bootstrap.php
或者
require_once 'path/to/PasswordLib/PasswordLib.php
您还可以使用任何[PSR-0] 3 自动加载器。PasswordLib 会自动检测是否有为其实例命名空间设置自动加载器,如果找到,则不会声明自己的(通过测试 PasswordLib\Core\AutoLoader 类是否存在来完成。如果存在,则表示已经声明了一个自动加载器。如果不存在,则加载核心实现)。
$classLoader = new SplClassLoader('PasswordLib', 'path/to/');
$classLoader->register();
请注意,您提供的路径是包含 PasswordLib 目录的目录。而不是 PasswordLib 目录本身。
安全随机数/字符串生成
PHP-PasswordLib 实现了 [RFC 4086 - 安全随机性要求] 中指定的方法 2。基本上,它从多个伪随机源生成随机数,并将它们“混合”以获得更好的随机数据质量。当您指定随机生成器的“强度”时,您实际上是在告诉系统您想使用哪些源。强度越高,使用的源越慢,也越可能脆弱。
混合函数也取决于所需的强度。对于非加密数字,使用简单的 XOR 混合函数(为了速度)。随着强度要求的增加,它将使用基于 SHA512 的混合函数,然后是基于 DES 的混合函数,最后在“高”强度下使用基于 AES-128 的混合函数。
所有这些都被隐藏在一个简单的 API 之后。
要生成用户可读的字符串,您可以使用 PasswordLib 类(默认生成中等强度的数字)
$crypt = new PasswordLib\PasswordLib;
$token = $crypt->getRandomToken(16);
或者您可以使用核心生成器以获得更多控制
$factory = new PasswordLib\Random\Factory;
$generator = $factory->getHighStrengthGenerator();
$token = $generator->generateString(16);
要生成盐,简单使用 PasswordLib::getRandomString() 或 Generator::generate()
密码散列和验证
支持多种密码散列算法。在创建新散列时,通过前缀(类似 CRYPT() 风格的前缀)选择算法。库将完成其余工作(生成盐等)
$crypt = new PasswordLib\PasswordLib;
$hash = $crypt->createPasswordHash($password, '$2a$'); // Blowfish
$hash = $crypt->createPasswordHash($password, '$S$'); // Drupal
在验证密码散列时,如果可能,库将实际上从格式中自动检测所使用的算法并进行验证。这意味着它就像
$crypt = new PasswordLib\PasswordLib;
if (!$crypt->verifyPasswordHash($password, $hash)) {
//Invalid Password!
}
您可以绕过自动检测并手动验证
$hasher = new PasswordLib\Password\Implementation\Joomla;
$hash = $hasher->create($password);
if (!$hasher->verify($password, $hash)) {
//Invalid Hash!
}
规范
-
支持的密码存储函数
- APR1 - Apache 的内部密码函数
- Blowfish - BCrypt
- Crypt - Crypt DES 散列
- Drupal - 基于 SHA512 的 Drupal 算法
- Hash - 通过长度检测的原始 md5、sha1、sha256 和 sha512
- Joomla - 基于 MD5 的 Joomla 算法
- Crypt MD5 - 对 Crypt 的 MD5 算法的支持
- PBKDF - PBKDF 实现(支持任何支持的基于密码的密钥派生)
- PHPASS - PHPASS 库的可移植散列的实现
- PHPBB - 基于 MD5 的 PHPBB 算法
- Crypt SHA256 - Crypt 的 SHA256 算法
- Crypt SHA512 - Crypt 的 SHA512 算法
-
支持的随机数来源
- CAPICOM - 在 Windows 系统上可用的 COM 对象方法调用
- MTRand - 基于 mt_rand() 函数的生成
- MicroTime - 基于服务器 microtime 的低熵源
- Rand - 基于 rand() 的低熵源
- URandom - 从系统的 /dev/urandom 源生成
- UniqID - 基于 uniqid() 的低熵源
库依赖
PHP-PasswordLib 作为库使用时唯一的依赖是 PHP 版本。它旨在完全独立于扩展,尽可能本地实现功能。
必需
- PHP >= 5.3.2
可选
- [MCrypt] 1 支持编译入
构建(测试)依赖
以下依赖项对于构建适合您环境的项目(包括运行单元测试、打包和代码质量检查)是必需的。
Pear 依赖
-
PDepend 通道(pear.pdepend.org)
- pdepend/PHP_Depend >= 0.10.0
-
Phing 通道(pear.phing.info)
- phing/Phing >= 2.4.0
-
PHPMD 通道(pear.phpmd.org)
- phpmd/PHP_PMD >= 1.1.0
-
PHPUnit 通道(pear.phpunit.de)
- phpunit/PHPUnit >= 3.5.0
- phpunit/PHP_CodeBrowser >= 1.0.0
- phpunit/phpcpd >= 1.3.0
- phpunit/phploc >= 1.6.0
-
PHP-Tools 通道(pear.php-tools.net)
- pat/vfsStream >= 0.8.0
-
默认Pear通道
- pear/PHP_CodeSniffer >= 1.3.0
- pear/PHP_UML >= 1.5.0
注意:您可以使用以下命令安装所有这些依赖项
pear channel-discover pear.pdepend.org
pear channel-discover pear.phing.info
pear channel-discover pear.phpmd.org
pear channel-discover pear.phpunit.de
pear channel-discover pear.php-tools.net
pear channel-discover components.ez.no
pear channel-discover pear.symfony-project.com
pear install pdepend/PHP_Depend
pear install phpmd/PHP_PMD
pear install pat/vfsStream
pear install PHP_CodeSniffer
pear install PHP_UML
pear install phpunit/PHPUnit
pear install phpunit/PHP_CodeBrowser
pear install phpunit/phpcpd
pear install phpunit/phploc
pear install phing/Phing
PHP 依赖
-
PHP >= 5.3.2
php.ini
设置phar.readonly = Off
-
PHP 扩展
- XDebug
- MCrypt
- Hash(通常已启用)
- Phar
- Zip(用于打包)
- BZ2(用于打包)
- XSL(用于文档)
安全漏洞
如果您发现了一个安全漏洞,请直接联系作者 me@ircmaxell.com。