You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写MySQL SELECT查询匹配经PHP crypt()加密的用户密码

解决方案

你尝试ENCRYPT函数不生效的核心原因是:PHP的crypt()函数如果不手动传入盐值,会自动生成随机盐,最终输出的加密字符串本身就包含了本次加密所用的盐。你直接调用ENCRYPT('明文密码')时,MySQL会重新生成新的随机盐加密,结果自然和库中存储的旧加密串不匹配。

可用的SQL查询写法

SQL的ENCRYPT函数支持传入第二个参数,直接传入库中存储的加密密码字段即可,它会自动提取该串中的盐值,用相同规则加密传入的明文:

$uncrypted_pw = 'password';
// 注意:此处仅做逻辑演示,实际使用请务必用预处理语句,避免SQL注入风险
$sql_query = "SELECT * FROM user WHERE pw = ENCRYPT('".$uncrypted_pw."', pw)";

更推荐的实践方案

我们更建议你在PHP层完成密码校验,不要把校验逻辑放到SQL中:

  • 先通过用户标识(比如用户名、用户ID)查询出对应存储的加密密码串
  • 用crypt($uncrypted_pw, $db_pw)或者更安全的password_verify()函数完成校验
  • 所有涉及用户输入的SQL操作必须用预处理语句,避免SQL注入漏洞

另外补充说明:你提到的「无盐加密」是误解,crypt()不传盐只是自动生成随机盐,并不是真的无盐,盐值已经包含在输出的加密字符串中。


内容的提问来源于stack exchange,提问作者jgautier

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 00:45:03