passwordlib/passwordlib

密码散列库

1.0.0-alpha2 2012-04-14 14:09 UTC

This package is auto-updated.

Last update: 2024-09-20 00:35:51 UTC


README

构建状态

Build Status

版本

当前版本被认为是Beta。这意味着它已经足够准备好进行测试和使用,但请注意,您应该频繁更新。

由于此软件为beta版本请自行承担风险

关于

PHP-PasswordLib旨在成为满足所有加密需求的综合性加密库。它旨在易于安装和使用,同时足够灵活和强大,以满足经验丰富的开发者。

安装

PasswordLib支持多种安装方法。

PHAR

下载标签页下载最新的phar构建。然后,只需在您的代码中require phar即可!

require_once '/path/to/PasswordLib.phar';

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(用于文档)

安全漏洞

如果您发现了一个安全问题,请直接联系作者 [email protected]