如何编写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
相关产品推荐
相关产品推荐

