[Yii2笔记]047密码操作和密码系统(Working with Passwords and Cryptography) [ 技术分享 ]
说明
学习Yii Framework 2(易2框架)的过程是漫长的,也是充满乐趣的,以下是我学习Yii2框架时对官网英文资料(请参见原文网址)的翻译和代码实现,提供了较完整的代码,供你参考。不妥之处,请多多指正!
原文网址:
http://www.yiiframework.com/doc-2.0/guide-security-passwords.html
3、Working with Passwords(密码操作)
http://www.yiiframework.com/doc-2.0/guide-security-cryptography.html
4、Cryptography(密码系统)
本文主题:密码操作和密码系统(Working with Passwords and Cryptography)
3、密码操作(Working with Passwords)
大多数开发者都知道密码不能存储为文本格式,但有一些开发者还在坚信使用md5或sha1加密的密码是安全的。使用上述加密算法在一段时间是足够安全的,但是现代硬件使得可以使用暴力攻击非常快速地反转这种散列,甚至更强大的算法。
为了给用户密码提供更高的安全性,即使在最坏的情况下(您的应用程序被攻破),你需要使用能够对野蛮攻击有力反击的加密算法。当前的最好选择是bcrypt,在PHP中你可以使用crypt函数生成一个bcrypt密文,Yii2提供了两个助手方法,它们使用crypt创建和验证密文更加容易。 当一个用户首次提供密码时(如在用户注册时),密码需要被加密: $hash=Yii::$app->getSecurity()->generatePasswordHash($password); 此密文与相应的模型属性相关联,它将被存储在数据库中以备使用。
当一个用户试图登录时,提交的密码必须使用前述的加密方法加密后与存储在数据库中的密码比对:
if (Yii::$app->getSecurity()->validatePassword($password, $hash)) {
//验证通过,记入登录日志
} else {
//密码错误
}
4、密码系统(Cryptography)
//创建随机数据(Generating Pseudorandom Data) 伪随机数据(Pseudorandom Data)在很多场景中被使用,例如,当通过邮件重设一个密码时,你需要生成一个令牌(token),将它保存在数据库中,使用email将它发送给用户,以此来证明他是这个账号的所有者。确保此令牌的唯一性并不被猜中,将显得非常重要,否则可能就会被攻击者猜中此令牌并重置用户的密码。 Yii安全助手使用得创建伪随机数非常容易:
$key=Yii::$app->getSecurity()->generateRandomString();
echo "key:".$key;
echo "<br>len:".strlen($key);
测试结果:
/*
key:6qxZZiicG2tn-RUC0VFLks-Q-_C7Ri04
len:32
*/
加密和解密(Encryption and Decryption)
Yii提供了内置的助手函数,可以使用一个密钥(secret key)加、解密数据。数据使用函数加密后,仅能被拥有密钥的人解密,例如,我们需要存储一些信息睚我们数据库中,但我们只允许有密钥的人可以查看它(哪怕应用数据库被透库):
$encryptedData=Yii::$app->getSecurity()->encryptByPassword($data,$secretKey);
紧接着用户想读取此数据:
$data=Yii::$app->getSecurity()->decryptByPassword($encryptedData,$secretKey);
加解密实例:encryptByPassword()
$data="This is data for many information";
$secretKey="my is key ok!";
$encryptedData=Yii::$app->getSecurity()->encryptByPassword($data,$secretKey);
echo "<br>encryptedData:".$encryptedData;//生成的$encryptedData每次都不相同
$data=Yii::$app->getSecurity()->decryptByPassword($encryptedData,$secretKey);
echo "<br>Data:".$data;
测试结果:
/*
encryptedData:c$s��l7>�i�;I#*47e4179de9c0857c72bde5b6f3f0a8577ed2d30f7acde92ff8f4cad3158d88d5�sX�9O9�ij��:�h���A��N��u��6�u��YN�F}��L���(��u�l}�����t���w��
Data:This is data for many information
*/
更为常用的是使用key代替password:
yii\base\Security::encryptByKey()
yii\base\Security::decryptByKey()
加解密实例:encryptByKey()
$data="This is data for many information By key";
$secretKey="my is key ok use Key";
$encryptedData=Yii::$app->getSecurity()->encryptByKey($data,$secretKey);
echo "<br>encryptedData By key:".$encryptedData;
$data=Yii::$app->getSecurity()->decryptByKey($encryptedData,$secretKey);
echo "<br>Data By key:".$data;
测试结果:
/*
encryptedData By key:.�yʞ�%��]��8d�66bec0f361aa08e7c8b7cfd32754cd4cb1fe34b45791aaba4686c8f6ebf7f4d9�������ei�8�1��y{ɦb#ѯ��=�g��I =]�7�D0#6�4�F�J���h���
Data By key:This is data for many information By key
*/
确保数据完整性(Confirming Data Integrity)
还有一种情形,你需要检测数据没有被第三方软件所篡改,也不会被其他一些方法所破坏。Yii提供了两个助手函数以确保数据完整性。 使用一个哈希码为数据添加前缀,此哈希码从密钥和数据中产生:
$data=Yii::$app->getSecurity()->hashData($genuineData,$secretKey);
检查数据完整性是否被破坏:
$data=Yii::$app->getSecurity()->validateData($data,$secretKey);
数据完整性实例:hashData()
$genuineData="This is data for many information By key";
$secretKey="my is key ok use Key";
$data=Yii::$app->getSecurity()->hashData($genuineData,$secretKey);
echo "<br>genuineData By key:".$genuineData;
$data=$data."OK";
echo "<br>data By key:".$data;
$data=Yii::$app->getSecurity()->validateData($data,$secretKey);
echo "<br>Data is OK:".var_export($data,true);
测试结果:
/*
genuineData By key:This is data for many information By key
data By key:b74cbfe790059077598e52e3a8ee21993f87e6b9a173713c7d9f59c875e2d534This is data for many information By keyOK
Data is OK:false
*/
(全文完)
共 0 条回复
阿江
最后登录:2024-03-03
在线时长:186小时21分
- 粉丝94
- 金钱16816
- 威望160
- 积分20276