【问题标题】:PHP Yii2 Password EncryptionPHP Yii2 密码加密
【发布时间】:2015-09-02 02:47:15
【问题描述】:

需要帮助,因为我还是 Yii2 的新手。我想在将密码保存到数据库之前对其进行加密。所以我使用 sha1 但问题是当我在下面显示的控制器中应用这行代码时,表单中的密码字段有内容。

$model->password = sha1($model->attributes['password']);

这是控制器的创建方法:

public function actionCreate()
{
    $model = new Employeeinformation();

    //$model->password = sha1($model->attributes['password']);

    $model->created_date = date('Y-m-d H:i:s');

    if ($model->load(Yii::$app->request->post()) && $model->save()) {
        return $this->redirect(['view', 'id' => $model->employee_id]);
    } else {
        return $this->render('create', [
            'model' => $model,
        ]);
    }
}

这是表格:

<div class="employeeinformation-form">

<?php $form = ActiveForm::begin(); ?>

<?= $form->field($model, 'employee_id')->textInput(['minlength' => true, 'maxlength' => true]) ?>

<?= $form->field($model, 'password')->passwordInput(['maxlength' => true]) ?>

<?= $form->field($model, 'last_name')->textInput(['maxlength' => true]) ?>

<?= $form->field($model, 'first_name')->textInput(['maxlength' => true]) ?>

<?= $form->field($model, 'hired_date')->widget(\yii\jui\DatePicker::classname(), [
    'language' => 'en',
    'dateFormat' => 'yyyy-MM-dd',
]) ?>



<div class="form-group">
    <?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
</div>

<?php ActiveForm::end(); ?>

我的问题截图:

http://i.imgur.com/YTDW1Ud.png

提前谢谢你。

【问题讨论】:

标签: php security yii2 password-hash


【解决方案1】:

我想在将密码保存到数据库之前对其进行加密。

不,你没有。好吧,您可能认为您想要加密密码,但如果您想保护用户,您实际上想要散列密码,而不是加密它。

SHA1 不提供加密,它是一个哈希函数。这是一个很常见的误解。您可以在链接的博客文章中了解有关 basic cryptography terms and concepts 的更多信息。

更重要的是:您不希望使用 SHA1 之类的快速哈希作为密码。 使用 password_hash()password_verify(),您将拥有安全的密码存储。你甚至不需要特别关心这些函数在内部做了什么来正确使用它们。

public function actionCreate()
{
    $model = new Employeeinformation();
    $post = Yii::$app->request->post();

    if ($model->load($post)) {
        $model->password = password_hash($model->password, PASSWORD_DEFAULT);
        $model->created_date = date('Y-m-d H:i:s');
        if ($model->save()) {
            return $this->redirect(['view', 'id' => $model->employee_id]);
        }
    }
    return $this->render('create', [
        'model' => $model,
    ]);
}

当员工登录时,您只需要这样做:

if (password_verify($request->password, $storedEmployeeData->hashed_password)) {
    // Success
}

【讨论】:

  • 哇,谢谢老兄的信息。我真的承认我误解了哈希和加密的区别。我将应用您的建议来改进我的编码。非常感谢!!!!!!
  • 很高兴听到这个消息。请把这些知识传授给大家。 :)
  • @Scott Arciszewski 一针见血。不要尝试做密码学,许多非常聪明的人会花费大量时间来解决它;使用已通过 password_*() 方法获得的内容。
【解决方案2】:

Yii2 在高级设置中带有用户模块。查看它如何以加密方式存储用户密码。

您可以在用户模型中使用setPassword() 方法来获取散列密码。

public function setPassword($password)
{
    $this->password_hash = Yii::$app->security->generatePasswordHash($password);
}

并在保存模型数据之前调用此方法。

public function signup()
{
    if ($this->validate()) {
        $user = new User();
        $user->username = $this->username;
        $user->email = $this->email;
        $user->setPassword($this->password);
        $user->generateAuthKey();
        if ($user->save()) {
            return $user;
        }
    }
    return null;
}

还可以查看 Yii2 文档中的 passwordsauthentication

【讨论】:

  • 你也可以在 Yii2 基础应用中使用 Yii::$app->security->generatePasswordHash($password)
【解决方案3】:

密码的内容在那里,因为您在通过保存(和验证)方法发送数据之前设置了属性。

如果你喜欢在控制器中做,你可以这样做:

public function actionCreate()
{
    $model = new Employeeinformation();

    if ($model->load(Yii::$app->request->post())){

        $model->password = sha1($model->password);
        $model->created_date = date('Y-m-d H:i:s');
        if ($model->save())
            return $this->redirect(['view', 'id' => $model->employee_id]);
    } 
    return $this->render('create', [
        'model' => $model,
    ]);

}

另一种方法,就是在Employeeinformation模型的beforeSave方法中做密码哈希(在模型类里面添加这个方法):

public function beforeSave($insert) 
{
    if(isset($this->password))
        $model->password = sha1($model->password);
    $model->created_date = date('Y-m-d H:i:s');

    return parent::beforeSave($insert);
}

如果使用 beforeSave 方法完成,控制器代码中的这两行可以删除,因为它们不再需要:

$model->password = sha1($model->password);
$model->created_date = date('Y-m-d H:i:s');

但是,参考http://www.yiiframework.com/doc-2.0/guide-security-passwords.html,不建议使用md5或sha1进行密码加密。 Yii2 提供了两个辅助函数来生成和验证密码。

用它来加密密码:

$hash = Yii::$app->getSecurity()->generatePasswordHash($password);

并验证它:

if (Yii::$app->getSecurity()->validatePassword($password, $hash)) {
    // all good, logging user in
} else {
    // wrong password
}

这比您发布的原始代码中使用的 sha1 更好。

【讨论】:

  • 效果很好。谢谢老兄:D(y)
【解决方案4】:

你可以看一下 User 模型例如,有方法 setPassword()

public function setPassword($password) { $this->password_hash = Yii::$app->security->generatePasswordHash($password); }

这是你在数据库上设置密码的方法,而且它已经被yii2加密了

【讨论】:

    【解决方案5】:
    $password = md5($password);
    

    最好的处理方式,确保将其与登录屏幕相关联以检查

    $passwordentered = md5($passwordentered);
    if ($passwordentered = "Correct"){
    "Grant Access"
    }
    

    希望这会有所帮助。

    【讨论】:

    • 你到底为什么会推荐 MD5?
    【解决方案6】:

    在你的模型中添加:

    public function beforeSave()
        {
            $this->password=md5($this->password);
            return true; 
        }
    

    现在将它添加到您的控制器中:

    $model->password = md5($model->password);
    

    【讨论】:

    • 投反对票,因为这是完全错误的,也是非常糟糕的做法。
    • 你到底为什么会推荐 MD5?
    猜你喜欢
    • 2023-03-18
    • 2012-05-06
    • 1970-01-01
    • 2017-11-09
    • 2017-04-11
    • 2014-03-26
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    相关资源
    最近更新 更多