那么,你想使用bcrypt吗?棒!但是,像密码学的其他领域一样,您不应该自己动手。如果您需要担心管理密钥,存储盐或生成随机数之类的事情,那么您做错了。
原因很简单:搞砸bcrypt非常容易。事实上,如果你查看此页面上的几乎每一段代码,你会发现它至少违反了这些常见问题中的一个。
面对现实,密码学很难。
留给专家。把它留给那些工作是维护这些图书馆的人。如果你需要做出决定,你做错了。
相反,只需使用库。根据您的要求,存在几种。
图书馆
以下是一些更常见的 API 的细分。
PHP 5.5 API - (适用于 5.3.7+)
从 PHP 5.5 开始,将引入一个新的 API 来散列密码。还有一个填充程序兼容性库(由我维护)用于5.3.7 +。这样做的好处是经过同行评审且易于使用的实现。
function register($username, $password) {
$hash = password_hash($password, PASSWORD_BCRYPT);
save($username, $hash);
}
function login($username, $password) {
$hash = loadHashByUsername($username);
if (password_verify($password, $hash)) {
//login
} else {
// failure
}
}
真的,它的目标是非常简单。
资源:
Zend\Crypt\Password\Bcrypt (5.3.2+)
这是另一个类似于PHP 5.5的API,并且具有类似的目的。
function register($username, $password) {
$bcrypt = new Zend\Crypt\Password\Bcrypt();
$hash = $bcrypt->create($password);
save($user, $hash);
}
function login($username, $password) {
$hash = loadHashByUsername($username);
$bcrypt = new Zend\Crypt\Password\Bcrypt();
if ($bcrypt->verify($password, $hash)) {
//login
} else {
// failure
}
}
资源:
密码库
这是一种略有不同的密码哈希方法。PasswordLib不是简单地支持bcrypt,而是支持大量的哈希算法。它主要在需要支持与可能不受您控制的旧系统和不同系统兼容的上下文中很有用。它支持大量的哈希算法。并且支持 5.3.2+
function register($username, $password) {
$lib = new PasswordLib\PasswordLib();
$hash = $lib->createPasswordHash($password, '$2y$', array('cost' => 12));
save($user, $hash);
}
function login($username, $password) {
$hash = loadHashByUsername($username);
$lib = new PasswordLib\PasswordLib();
if ($lib->verifyPasswordHash($password, $hash)) {
//login
} else {
// failure
}
}
引用:
断续器
这是一个支持bcrypt的层,但也支持一个相当强大的算法,如果你无法访问PHP>= 5.3.2,这个算法很有用。它实际上支持PHP 3.0 +(尽管不支持bcrypt)。
function register($username, $password) {
$phpass = new PasswordHash(12, false);
$hash = $phpass->HashPassword($password);
save($user, $hash);
}
function login($username, $password) {
$hash = loadHashByUsername($username);
$phpass = new PasswordHash(12, false);
if ($phpass->CheckPassword($password, $hash)) {
//login
} else {
// failure
}
}
资源
注意:不要使用未托管在开放墙上的PHPASS替代方案,它们是不同的项目!!!
关于我们
如果您注意到,这些库中的每一个都返回一个字符串。这是因为BCrypt在内部的工作方式。关于这一点有很多答案。以下是我写的一个选择,我不会在这里复制/粘贴,但链接到:
㯱
有许多不同的选择。你选择哪个取决于你。但是,我强烈建议您使用上述库之一来为您处理此问题。
同样,如果您直接使用,则可能做错了什么。如果你的代码直接使用(或或),你几乎肯定做错了什么。crypt()
hash()
md5()
sha1()
只需使用库...