itcover/password-processor

此包最新版本(1.0.1)没有可用的许可信息。

无框架密码处理库

1.0.1 2017-01-18 14:19 UTC

This package is not auto-updated.

Last update: 2024-09-14 20:09:36 UTC


README

Build Status

PHP无框架密码处理库。

关于

这只是围绕PHP的自己的password_*()函数的一个包装器。

目前使用的是bcrypt,工作因子为11,但随着安全性的提高,这两者都将进行更新。

对于新开发,它只是进行底层的函数调用,将密码哈希抽象化,从您的业务逻辑中分离出来,让您少关心一个架构问题。

对于旧应用,它还提供了一个简单的方法将旧密码哈希算法升级到现代版本。

注意: 这 NOT 是一个功能齐全的认证、授权或ACL库!它只会处理创建、验证和更新密码哈希。

动机

PHP的password扩展非常好,但它仍然只是“仅仅”一种语言原语 - 它提供工具,而不是完整的解决方案。正如它应该那样。

这个库就是完整的解决方案。

它旨在与应用程序集成,而不是反过来,所以您不必担心如何抽象它。它提供了一个无缝的方式从任何旧的哈希算法迁移,因此您也不必担心这个问题。它具有明确的意见,并且故意省略了任何自定义选项,所以只有一个使用方法,没有不安全的选项。

安装

需要PHP 5.6或更高版本。始终推荐使用PHP的最新稳定版本。

通过Composer(推荐的方式)

composer require itcover/password-processor

手动(您需要了解您正在做什么)

git clone 或从这里下载并解压归档版本,然后require autoload.php 文件。

示例

初始化

实现一个数据访问对象来访问您的密码哈希数据源,使用 \ITCover\PasswordProcessor\DAOInterface。通常,这将是应用程序本地数据库中的“用户”表。

<?php
namespace Your\Namespace;

use \ITCover\PasswordProcessor\DAOInterface as DAOInterface;

class UsersDAO implements DAOInterface
{
    private $pdo;

    public function __construct(\PDO $pdo)
    {
        $this->pdo = $pdo;
    }

    public function getPasswordHashForIdentity($identity)
    {
        $query = $this->pdo->prepare("SELECT password FROM users WHERE username = :username");
        $query->execute([':username' => $identity]);
        $result = $query->fetch(\PDO::FETCH_ASSOC);
        return empty($result) ? null : $result['password'];
    }

    public function setPasswordHashForIdentity($identity, $passwordHash)
    {
        $query = $this->pdo->prepare("UPDATE users SET password = :password WHERE username = :username");
        $query->execute([
            ':password' => $passwordHash,
            ':username' => $identity
        ]);
    }
}

然后将它传递给我们的Processor类构造函数

<?php
use \Your\Namespace\UsersDAO;
use \ITCover\PasswordProcessor\Processor;

$pdo = new \PDO('mysql:dbname=foo;host=127.0.0.1', 'username', 'password');
$dao = new UsersDAO($pdo);

$passwordProcessor = new Processor($dao);

显然,您的应用程序逻辑会比这复杂得多,这里我们只是使用PDO作为示例,但您真正需要使用Processor类的是实现我们的DAOInterface的对象。

使用

// $passwordProcessor = new \ITCover\PasswordProcessor\Processor($dao);

// Creating a password for a new user:
$passwordHash = $passwordProcessor->hashPassword($passwordInput);

// Updating a user's password:
$passwordProcessor->updatePassword($username, $password);

// Verifying, and AUTOMATICALLY UPDATING (re-hashing) a user's password
// (your typical login scenario)
if ($passwordProcessor->verifyPassword($username, $password))
{
    // login logic here
}
else
{
    // log failures, apply rate-limits, redirect back to login screen, etc.
}

从旧哈希函数升级

只需将您的旧哈希函数作为可调用的参数传递给构造函数

$passwordProcessor = new Processor($dao, function($inputPassword) use ($salt) {
    return \hash('sha256', $inputPassword.$salt);
});

接受任何可调用的参数 - 从简单的函数名,如'sha1'(但希望不是那样差),到静态类方法,再到闭包(匿名函数)和对象方法。只需确保回调接受一个字符串参数并返回一个字符串哈希即可。