bolt/passwordlib

密码散列库

1.0.1 2018-08-24 13:44 UTC

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 方法用于获取随机数据。其中两个特别有用的是 getRandomNumbergetRandomToken

  • 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