PHP的行为';s密码_hash()

PHP的行为';s密码_hash(),php,passwords,salt,bcrypt,Php,Passwords,Salt,Bcrypt,我一直在寻找加密密码的最佳方法,以便与我的小组一起使用,我决定继续使用BCRYPT,这仅仅是因为每次加密的成本以及它通常被认为是当前可用的最佳方法之一 我使用的是双向盐,所以每个用户都有一种独特的盐,很明显,我的应用程序中存储的盐,我注意到了一些非常奇怪的行为。。根据PHP文档,这种行为是正常的吗 无论如何,以下是我使用的代码: $Crypto = new Crypto; echo $Crypto->encrypt( "123456789abcdefghijklm", "StackOver

我一直在寻找加密密码的最佳方法,以便与我的小组一起使用,我决定继续使用BCRYPT,这仅仅是因为每次加密的成本以及它通常被认为是当前可用的最佳方法之一

我使用的是双向盐,所以每个用户都有一种独特的盐,很明显,我的应用程序中存储的盐,我注意到了一些非常奇怪的行为。。根据PHP文档,这种行为是正常的吗

无论如何,以下是我使用的代码:

$Crypto = new Crypto;
echo $Crypto->encrypt( "123456789abcdefghijklm", "StackOverflow_Is_Awesome!" ); // First parameter being the "User Salt", second being the password.

// Above outputs $2y$13$123456789abcdefghijkleepFY8JLvsf2YbnWolqQyO3DIzrCeNIu
现在,加密类:

<?php
// ASSUMING $this->hashingSalt = HBSNi3y7ruhbVGkhdg83ijdbvghiojkgudL;JP
class Crypto {

private $hashingSalt, $database;

public function __construct( $salt )
{
    $this->hashingSalt = $salt;
    $this->database = new DatabaseFunctions();
}

public function encrypt( $salt, $password )
{
    $options = array(
        'cost' => 13,
        'salt' => $salt //22 chars
    );

    return password_hash( $password . $this->hashingSalt, PASSWORD_BCRYPT, $options);
}
}

salt的存在是为了防止使用散列生成预先计算的表的可能性,并且它并不意味着一旦“坏人”掌握了散列就可以保持安全

还有你正在做的事情:

很明显,我的应用程序中存储的盐

它被称为辣椒(其实并不那么明显),而且它还没有被证明更安全。有关更多信息,请阅读此博客帖子(也是密码API的作者):


还请注意,名为
encrypt
的方法没有加密任何内容。加密是双向的。您正在执行的操作称为哈希:

您好,谢谢。首先感谢你教我哈希和加密的区别,这是一个愚蠢的错误。我现在就开始改变它!我已经阅读了这两个链接,并获得了一些关于哈希和我正在使用的api的有价值的信息,因此我要为此感谢您。所以,我所做的一切都是正确的,只是胡椒并没有起到多大作用,对吗?嗯,我知道你是想自己把盐放好。在大多数情况下,您不想这样做,因为API会为您做一些事情,而且很容易“搞砸”。如果您想了解它如何更好地工作,可以查看代码。谢谢您的回复,我必须使用compat库,因为我仍在等待主机升级到5.5>。我仔细查看了代码,发现它非常有用。实际上,我的密码最初没有被api中的函数验证的原因是,我在使用password_verify()函数之前对它们进行了哈希运算。谢谢你的帮助,PeeHaa,看来我把事情搞得太复杂了,真的,和平常没什么两样!所以,现在我已经安排好了自己做所有的盐生意,排除了中间人。。。谢谢!:)@JakeBall-绝对同意PeeHaa的回答。有一种情况是,pepper确实提高了安全性,即攻击者可以访问您的数据库(SQL注入),但不知道pepper(无法访问服务器)。然后,pepper可以阻止字典攻击,并可以保护弱密码。要添加胡椒粉,请执行如下操作:
$pepperedPassword=hash_hmac('sha256',$password,$pepper,false)
,然后使用加胡椒的密码调用
密码\u hash()
。正如PeeHaa已经写的,不要把你自己的盐传递给函数。也许值得注意的是,在任何情况下都应该避免使用辣椒。这是一个例子。您可以使用更好的加密实践,这些实践已经得到了实际的研究和理解。而不是发明你自己的方法。。。