Android与PHP间BCrypt密码加密验证问题咨询
嘿,我来帮你理清这个问题——你现在的核心误区其实是搞反了密码处理的正确流程,咱们一步步拆解:
先搞懂
password_verify()的本质 这个PHP函数的设计逻辑很明确:它是用来比对用户输入的明文密码和服务器存储的哈希值的,而不是让你把客户端加密后的密码和哈希值做比对。你现在的操作相当于把客户端加密后的字符串当成了“伪明文”去生成哈希存储,但登录时又重复发送这个加密字符串,自然没法用password_verify()正常验证。
正确的密码处理流程(行业通用标准)
1. 注册环节
- 客户端:用户输入明文密码后,直接通过**HTTPS(SSL/TLS)**发送到服务器,不需要自己额外做加密。
- 服务器:收到明文密码后,用
password_hash()生成带随机盐的安全哈希值,只把这个哈希值存入数据库,绝对不要存储明文或者客户端加密后的字符串。// 注册时的PHP示例代码 $userPlainPassword = $_POST['password']; // 通过HTTPS拿到用户输入的明文密码 $secureHash = password_hash($userPlainPassword, PASSWORD_DEFAULT); // 将$secureHash存入数据库对应用户的字段中
2. 登录环节
- 客户端:用户输入明文密码,同样通过HTTPS发送到服务器。
- 服务器:从数据库取出该用户对应的哈希值,用
password_verify()完成比对:// 登录时的PHP示例代码 $userInputPassword = $_POST['password']; // 明文密码(HTTPS传输) $storedHash = // 从数据库取出的该用户的哈希值 if (password_verify($userInputPassword, $storedHash)) { // 密码验证通过,执行登录逻辑 } else { // 密码错误,返回提示 }
关于你当前的“客户端加密后发送”的处理方案
如果你已经按这个逻辑实现了注册,现在想调整,有两个选择:
选项一:重构流程(强烈推荐)
直接放弃客户端加密密码的步骤,改用上面的标准流程。这是最安全、最简洁的方案,原因在于:
HTTPS已经在传输层完成了端到端的加密,所有传输的数据(包括明文密码)都会被加密,中间人只能看到乱码,根本无法获取明文内容。只要你的服务器配置了有效的SSL证书,传输过程是完全安全的。
选项二:保留客户端加密(不推荐)
如果因为某些原因必须保留客户端加密,那你需要把客户端加密后的字符串当成password_verify()需要的“明文”来处理:
- 登录时客户端发送加密后的字符串到服务器;
- 服务器直接用这个加密字符串和数据库中存储的加密字符串的哈希值做比对:
但这种做法完全没必要,不仅增加了复杂度,还可能引入额外风险——比如客户端加密算法如果不够安全(比如用了MD5、SHA1这类无盐哈希),反而会降低整体安全性,而$clientEncryptedPwd = $_POST['encrypted_password']; $storedHash = // 数据库中存储的password_hash(客户端加密串, ...) if (password_verify($clientEncryptedPwd, $storedHash)) { // 验证通过 }password_hash()生成的哈希是自带随机盐的,彩虹表根本无法破解。
关键安全结论
用HTTPS传输明文密码是安全的,这是行业通用的标准做法。额外的客户端加密不仅画蛇添足,还可能埋下安全隐患。
内容的提问来源于stack exchange,提问作者S.D.
相关产品推荐
相关产品推荐

