2013-07-17 175 views
12

我正在爲一款遊戲開發所謂的AAC(自動賬戶創建器),它基本上是一個可以爲玩家創建賬戶,玩家和其他幾項功能的網站。服務器只支持SHA1和普通 - 這是完全不安全的。我無法深入瞭解源代碼並進行更改。如果無論如何要使用SHA1,我將不勝感激。我剛剛閱讀了關於BCrypt的文章,這很棒,但我無法真正改變源代碼以適合BCrypt。我設法把SHA1上註冊這樣的:如何在Laravel 4中使用SHA1加密而不是BCrypt?

$password = $input['password']; 
$password = sha1($password); 

但我根本無法登錄。我做錯了嗎?似乎Laravel不會讓我登錄。

我有get_registerpost_register,我也有get_loginpost_login。我是否需要更改post_login中的內容以使其登錄或? 任何提示?

我正在使用Laravel的php服務器(php artisan serve)和phpMyAdmin在WAMP上。我想Laravel會檢查你通過Auth::attempt方法檢查數據庫的方式laravel正在做某種形式的散列檢查來檢查當前的pw和登錄的一個來檢查對方。

+0

確保您的密碼字段的長度至少爲100個字符。 –

+1

它有255個字符。我只需要讓SHA1加密方法工作。 – dinomuharemagic

+0

Laravel在'auth'上做了一些機制,也許它使用'bcryp't來檢查密碼,但是不完全確定它。 –

回答

36

您必須重寫Hash模塊。感謝Laravel遵循IoC和依賴注入概念的想法,它會相對容易。

首先,創建一個文件夾app/libraries並將其添加到作曲家的autoload.classmap:現在

"autoload": { 
    "classmap": [ 
     // ... 

     "app/libraries" 
    ] 
}, 

,這是我們創建的上課時間。創建一個SHAHasher類,實現Illuminate\Hashing\HasherInterface。我們需要實現3種方法:make,checkneedsRehash

注意:在Laravel 5上,執行Illuminate/Contracts/Hashing/Hasher而不是Illuminate\Hashing\HasherInterface

應用程序/庫/ SHAHasher.php

class SHAHasher implements Illuminate\Hashing\HasherInterface { 

    /** 
    * Hash the given value. 
    * 
    * @param string $value 
    * @return array $options 
    * @return string 
    */ 
    public function make($value, array $options = array()) { 
     return hash('sha1', $value); 
    } 

    /** 
    * Check the given plain value against a hash. 
    * 
    * @param string $value 
    * @param string $hashedValue 
    * @param array $options 
    * @return bool 
    */ 
    public function check($value, $hashedValue, array $options = array()) { 
     return $this->make($value) === $hashedValue; 
    } 

    /** 
    * Check if the given hash has been hashed using the given options. 
    * 
    * @param string $hashedValue 
    * @param array $options 
    * @return bool 
    */ 
    public function needsRehash($hashedValue, array $options = array()) { 
     return false; 
    } 

} 

現在,我們有我們的類來完成,我們希望它在默認情況下被使用,通過Laravel。要做到這一點,我們將創建SHAHashServiceProvider,延長Illuminate\Support\ServiceProvider,並將其註冊爲hash成分:

應用程序/庫/ SHAHashServiceProvider.php

class SHAHashServiceProvider extends Illuminate\Support\ServiceProvider { 

    /** 
    * Register the service provider. 
    * 
    * @return void 
    */ 
    public function register() { 
     $this->app['hash'] = $this->app->share(function() { 
      return new SHAHasher(); 
     }); 

    } 

    /** 
    * Get the services provided by the provider. 
    * 
    * @return array 
    */ 
    public function provides() { 
     return array('hash'); 
    } 

} 

酷,現在我們要做的就是確保我們的應用程序加載正確的服務提供商。上app/config/app.phpproviders下,除去下面的行:

'Illuminate\Hashing\HashServiceProvider', 

然後,添加這一個:

'SHAHashServiceProvider', 
+0

謝謝哥們,我只想問你我現在怎麼用它?我使用標準的Hash :: make功能嗎? EDIT-它會返回一個錯誤,因爲我刪除了'Illuminate \ Hashing \ HashServiceProvider',在提供程序下並添加了'SHAHashServiceProvider':http://3.imgland.net/C8Kem.png 以下是我更改提供程序的方式:http ://1.imgland.net/zEongM.png – dinomuharemagic

+0

凹凸不平,任何人都可以幫我解決我的新問題嗎? – dinomuharemagic

+0

哎呀,我的壞。添加新服務提供商時,我在我的帖子上輸入了錯字。它是'SHAHashServiceProvider',而不是'SHAHashServiceProvider'。 (注意最後一個撇號) – rmobis

3

實際上有像這樣的情況下,更容易(或更簡單的,至少)溶液。你可以通過在用戶模型中使用這種方法'假'散列:

public function getAuthPassword() { 
    return Hash::make($this->password); 
} 

並用你自己的散列函數散列輸入。舉例來說,如果你的密碼當前與SHA1散列,可以驗證與

Auth::attempt(array('email' => $email, 'password' => sha1($password)) 

用戶它不感覺像良好的編碼習慣,做這種方式,但它肯定會比更容易重寫散列模塊。

+0

看起來不錯。我認爲最好的方法是「祕密」用正確保護的密碼替換舊的密碼。 (見[這]](http://stackoverflow.com/questions/19878319/laravel-4-auth-use-md5-instead-of-the-integrated-hashmake)) – zehelvion

+0

真的好主意,但這一個不作爲Hash :: Facade加密用戶密碼,當試圖在數據庫中驗證密碼時。所以最好使用上面的ServiceProvider實現來處理md5哈希。 最好使用bcrypt或sha1而不是md5,但在某些不是選項的項目中=( – trm42

+3

@ trm42其實它可以工作,它使用散列(X)== Y比較傳入密碼X和數據庫密碼Y,因爲它假定Y已經被正確地散列了,我們正在做的是設置X匹配Y,然後散列Y使它匹配X.然後正在運行的實際測試是hash(sha1(X))== hash (sha1(Y))。看看守護類的源代碼,你會看到它是如何工作的 – Benubird