itcover / password-processor
无框架密码处理库
Requires
- php: ^5.6 || ^7
Requires (Dev)
- phpunit/phpunit: ^5.0 || ^6.0
This package is not auto-updated.
Last update: 2024-09-14 20:09:36 UTC
README
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'(但希望不是那样差),到静态类方法,再到闭包(匿名函数)和对象方法。只需确保回调接受一个字符串参数并返回一个字符串哈希即可。