如何在Laravel 4中使用SHA1encryption而不是BCrypt?
我正在开发一款所谓的AAC(自动账户创build器),它基本上是一个可以为玩家创build账户,玩家和其他东西的网站。 服务器只支持SHA1和普通 – 这是完全不安全的。 我不能潜入源代码并进行更改。 如果有反正使用SHA1,我将不胜感激。 我刚刚阅读了关于BCrypt,这是伟大的,但我不能真正改变源代码,以适应BCrypt。 我设法把SHA1注册为这样的:
$password = $input['password']; $password = sha1($password);
但我根本无法login。 我做错了吗? 好像Laravel不会让我login。
我有get_register
和post_register
,也有get_login
和post_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个方法: make
, check
和needsRehash
。
注意:在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))
这样做并不像是一种好的编程习惯,但是它肯定比重写哈希模块容易一些。