2013-04-08 65 views
2

我一直在寻找加密密码以便与我的面板一起使用的最佳方式,我决定继续使用BCRYPT,只是由于每次加密的成本以及它一般被认为是目前最好的一种。PHP的password_hash行为()

我使用的是双向盐,所以每个用户都有一个独特的盐,然后显然存储在我的应用程序中的盐,我注意到一些相当奇怪的行为..根据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); 
} 
} 

所以,我关心的是,为什么在地球上是此功能只添加盐在选项中设置输出字符串的开始?它真的很莫名其妙...因为这不是我所说的安全,而是将对象击败给我。

任何人都可以建议,尝试和解释我完全看过去?由于

PHP文件:http://php.net/manual/en/function.password-hash.php

回答

4

的盐,以防止有制作与哈希预先计算的表的可能性,这并不意味着保持安全,一旦“坏人”的哈希得到他们的手。

而且你在做什么:

,然后明显盐储存在我的应用程序

被称为辣椒(是真的不那么明显的),所以据我所知这不是招”内被证明是更安全的。欲了解更多信息,请阅读我这篇文章(也是由密码API的作者):http://blog.ircmaxell.com/2012/04/properly-salting-passwords-case-against.html

另外请注意,你的方法被称为encrypt不加密任何东西。加密是两种方式。你在做什么叫做哈希:https://stackoverflow.com/a/4948393/508666

+0

你好,谢谢。首先感谢教育我哈希和加密之间的区别,愚蠢的错误。我现在将开始改变!我已经阅读了这两个链接,并获得了一些关于哈希和我正在使用的api的有价值的知识,所以我想为此感谢你。所以,我所做的一切正确,只是胡椒粉没有什么区别,对吗? – 2013-04-08 00:23:49

+0

嗯,我看到你正试图自己设置盐。在大多数情况下,你不想这样做,因为这是API会为你做的事情,而且它很容易被“搞砸”。如果你想知道它是如何工作的更好,你可以查看代码[in PHP](https://github.com/ircmaxell/password_compat)。 – PeeHaa 2013-04-08 00:26:59

+0

谢谢您的回复,我必须使用该compat-library,因为我仍在等待主机升级到5.5>。我已经查看了代码,发现它实际上非常有用,为什么我的密码最初不是由api中的函数验证的,因为我在使用password_verify()函数之前对它们进行了哈希处理。感谢您的帮助PeeHaa,看起来我过分复杂的事情是真的,与标准没有什么不同!所以,现在我已经设立了所有的盐业务,排除了中间人......谢谢! :) – 2013-04-08 01:02:32