PHP Yii2密码加密

3

我希望你能帮助我,因为我还不熟悉Yii2。我想在将密码保存到数据库之前加密它。所以我使用sha1,但问题是当我在控制器中应用以下代码行时,表单中的密码字段会显示出内容。

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

这是控制器create方法:

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密码的安全哈希和盐的重复问题。 - Nathan Tuggy
这是浏览器的自动填充功能。尝试将属性名称更改为除“password”之外的其他内容,例如“pwd”,看看自动填充是否仍然存在。 - Osh Mansor
请阅读此链接:http://php.net/manual/zh/book.password.php - Sergey
@OshMansor。我尝试更改属性名称,但自动填充仍然存在。 - WaduNoop
6个回答

16

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

不,你不需要这样做。虽然你可能认为你需要加密密码,但如果你想保护用户,实际上你需要对密码进行哈希,而不是加密。

SHA1并不提供加密功能,它是一种哈希函数。 这是一个非常普遍的误解。你可以在链接的博客文章中了解更多基本密码学术语和概念

更重要的是:你不应该使用像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
}

1
哇,谢谢你提供的信息,伙计。我真的承认我误解了哈希和加密的区别。我会应用你的建议来改进我的编码。非常感谢!!! - WaduNoop
很高兴听到这个消息。请把这个知识传递下去。 :) - Scott Arciszewski
1
@Scott Arciszewski说得很对。不要尝试做密码学,许多非常聪明的人花费了大量时间来研究它;使用已经通过password_*()方法提供的内容即可。 - David J Eddy

8

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

您可以使用User Model中的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文档中有关密码身份验证的内容。


在Yii2基本应用程序中,您也可以使用Yii::$app->security->generatePasswordHash($password)。 - Gianpaolo Scrigna

0

你可以看一下用户模型的例子,有一个名为setPassword()的方法

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

这就是如何在数据库中设置密码,而且它已经被Yii2加密了


0

密码的内容存在是因为您在通过save(和validate)方法发送数据之前设置了该属性。

如果您想在控制器中执行此操作,则可以按照以下方式操作:

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) - WaduNoop

-5
$password = md5($password);

处理的最佳方式是确保将其与登录屏幕相关联以进行检查

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

希望这能有所帮助。

1
你为什么会建议使用MD5呢? - Scott Arciszewski

-6
在你的模型中添加:
public function beforeSave()
    {
        $this->password=md5($this->password);
        return true; 
    }

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

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

1
因为这是完全错误的,而且也是非常糟糕的做法,所以被踩了。 - chris---
1
你为什么会建议使用MD5呢? - Scott Arciszewski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接