如何在Laravel 4中使用SHA1encryption而不是BCrypt?

我正在开发一款所谓的AAC(自动账户创build器),它基本上是一个可以为玩家创build账户,玩家和其他东西的网站。 服务器只支持SHA1和普通 – 这是完全不安全的。 我不能潜入源代码并进行更改。 如果有反正使用SHA1,我将不胜感激。 我刚刚阅读了关于BCrypt,这是伟大的,但我不能真正改变源代码,以适应BCrypt。 我设法把SHA1注册为这样的:

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

但我根本无法login。 我做错了吗? 好像Laravel不会让我login。

我有get_registerpost_register ,也有get_loginpost_login 。 我是否需要在post_login中更改某些内容以使其login或? 任何提示?

我正在使用Laravel的php服务器(php artisan serve)和phpMyAdmin在WAMP上。 我认为Laravel通过Auth::attempt方法检查数据库的时间,laravel正在做一些哈希的forms来检查当前的pw和login的一个来检查对方。

你将不得不重写Hash模块。 感谢Laravel遵循IoC和dependency injection概念的想法,这将是相对容易的。

首先,创build一个app/libraries文件夹,并将其添加到composer php的autoload.classmap

 "autoload": { "classmap": [ // ... "app/libraries" ] }, 

现在是我们创buildclass级的时候了。 创build一个SHAHasher类,实现Illuminate\Hashing\HasherInterface 。 我们需要实现3个方法: makecheckneedsRehash

注意:在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默认使用它。 为此,我们将创buildSHAHashServiceProvider ,扩展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.php ,在providers下,删除以下行:

 'Illuminate\Hashing\HashServiceProvider', 

然后,添加这个:

 'SHAHashServiceProvider', 

对于这种情况,实际上有一个更容易(或者更简单,至less)的解决scheme。 你可以通过在用户模型中使用这个方法来“伪造”散列:

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

并用你自己的散列函数散列input。 例如,如果你的密码当前是用sha1散列的,你可以用这个来validation用户

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

这样做并不像是一种好的编程习惯,但是它肯定比重写哈希模块容易一些。