Yii框架的Security组件怎么用_加密解密和哈希验证【操作】

轻芳大大_9554

轻芳大大_9554

2026-03-26

811人浏览

原创

应使用 encryptbykey 和 decryptbykey 进行对称加解密,而非 encrypt/decrypt;密码哈希必须用 generatepasswordhash 和 validatepassword;hashdata 仅适用于防篡改签名且需手动管理 salt。

yii框架的security组件怎么用_加密解密和哈希验证【操作】

加密解密用 encryptByKey 和 decryptByKey,别碰 encrypt/decrypt

Yii 的 Security 组件默认不提供“密码学安全”的对称加解密接口,encrypt 和 decrypt 是为 Cookie 签名/加密设计的内部方法,硬用会导致密钥管理混乱、无法跨版本解密,甚至触发 InvalidParamException 错误。

正确做法是走 encryptByKey(AES-128-CBC,默认)+ decryptByKey,它接受明文、密钥和可选 IV:

use yii\base\Security;

$security = new Security();
$key = '32-byte-secret-key-must-be-exactly-this-long'; // 必须 32 字节
$plaintext = 'hello world';
$ciphertext = $security->encryptByKey($plaintext, $key);
$decrypted = $security->decryptByKey($ciphertext, $key); // 成功返回 'hello world'
  • encryptByKey 默认生成随机 IV 并前置到密文开头(base64 后),decryptByKey 会自动拆分——别自己拼 IV
  • 密钥长度必须严格匹配算法:AES-128 要 16 字节,AES-256 要 32 字节;传错长度会静默降级或报 InvalidParamException
  • 密文是二进制数据,存数据库或传 HTTP 时务必 base64_encode;反过来解密前要 base64_decode

哈希密码用 generatePasswordHash + validatePassword,不是 hashData

存用户密码必须用 PBKDF2(Yii 默认),而不是通用哈希函数。直接调 hashData 得到的是不可逆但无盐、无迭代的哈希,等于裸奔。

generatePasswordHash 自动生成随机 salt、固定 10 万次迭代(可配),输出格式为 y$...(bcrypt 兼容格式):

Yii Framework 2.0.51
Yii Framework 2.0.51

Yii Framework 2.0.51 官方 Basic 应用模板,适合旧项目兼容、升级验证和开发测试。

下载
$hash = $security->generatePasswordHash('my-pass-123');
// 输出类似:$2y$13$ZzFmYzEwZjMxZDQyYzQyY.9uUzIzZjMxZDQyYzQyYzQyYzQyY
  • validatePassword 自动解析 hash 中的 salt 和 cost,无需你传参——传错参数反而会跳过校验逻辑
  • 不要自己拼 crypt() 或调 hash('sha256', ...),这类哈希无法抵御彩虹表或 GPU 暴力破解
  • 如果旧系统用了其他算法(如 bcrypt 原生 hash),validatePassword 仍能兼容验证,但迁移时别覆盖原 hash

敏感数据加盐哈希用 hashData,但必须手动管 salt

hashData 适合做「防篡改」签名,比如生成带时效的下载链接 token,或校验配置项是否被修改。它不是密码哈希工具,也不自动加盐。

  • 必须显式传 salt:$security->hashData($data, $secretKey),其中 $secretKey 就是 salt,要保密且固定
  • 输出是 base64 编码的 HMAC-SHA256,长度固定 44 字符;验证用 validateData,它会自动重算并比对
  • 别用它存密码——没迭代、没随机 salt,hashData('123', 'salt') 在毫秒级就能被撞库
  • Web 应用里常见误用:把用户 ID 直接 hashData($id, $key) 当 token 用,结果 key 泄露就全盘崩坏

注意 Yii 版本差异:2.x 和 3.x 的 Security 不兼容

Yii 2.0 的 Security 类在 yii\base\Security,而 Yii 3.0 拆到了 yii\security\Security,且默认算法不同:

  • Yii 2.0:encryptByKey 默认 AES-128-CBC;generatePasswordHash 默认 PBKDF2-SHA256
  • Yii 3.0:encryptByKey 默认 AES-256-CBC;generatePasswordHash 默认使用 password_hash()(bcrypt)
  • 跨版本迁移加密数据?不行。密文结构、IV 处理、密钥派生逻辑全变了,必须重新加解密
  • 升级前检查所有 encryptByKey 调用点——尤其是密钥长度和是否手动处理了 IV

最麻烦的不是 API 变了,而是加密结果不可逆兼容。线上有存量密文的话,得留双轨逻辑跑一段时间。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

yii yii框架

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
cookie
cookie

Cookie 是一种在用户计算机上存储小型文本文件的技术,用于在用户与网站进行交互时收集和存储有关用户的信息。当用户访问一个网站时,网站会将一个包含特定信息的 Cookie 文件发送到用户的浏览器,浏览器会将该 Cookie 存储在用户的计算机上。之后,当用户再次访问该网站时,浏览器会向服务器发送 Cookie,服务器可以根据 Cookie 中的信息来识别用户、跟踪用户行为等。

2023.06.30

11959

10

document.cookie获取不到怎么解决
document.cookie获取不到怎么解决

document.cookie获取不到的解决办法:1、浏览器的隐私设置;2、Same-origin policy;3、HTTPOnly Cookie;4、JavaScript代码错误;5、Cookie不存在或过期等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.11.23

1146

5

阻止所有cookie什么意思
阻止所有cookie什么意思

阻止所有cookie意味着在浏览器中禁止接受和存储网站发送的cookie。阻止所有cookie可能会影响许多网站的使用体验,因为许多网站使用cookie来提供个性化服务、存储用户信息或跟踪用户行为。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

824

5

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

2025.08.19

1906

14

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

2023.09.14

13866

6

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.14

1645

5

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

2023.12.21

3797

3

token什么意思
token什么意思

token是一种用于表示用户权限、记录交易信息、支付虚拟货币的数字货币。可以用来在特定的网络上进行交易,用来购买或出售特定的虚拟货币,也可以用来支付特定的服务费用。想了解更多token什么意思的相关内容可以访问本专题下面的文章。

2024.03.01

5961

5

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

2023.10.19

3148

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Yii Framework 2.0 API 官方文档
Yii Framework 2.0 API 官方文档

共0课时 | 0人学习

Yii2.0框架开发实战视频教程
Yii2.0框架开发实战视频教程

共22课时 | 9.3万人学习