2013-04-08 41 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