密码加密与登录验证的原理是怎样的?

2016-12-30 14:57:11 +08:00
 kimwang
新人问题,大家请别笑,不是 ITer ,想撸个轻论坛,一切从概念学起。

我了解了一下,常见加密方式可能有: escape 、 md5 、 sha 、 base64
escape 和 base64 好像可逆?

那么我应该采用哪种方式为密码加密?
用户登录时验证,是对输入的密码从新加密一次,然后对比数据库已加密的字符是否一致来判断是否放行吗?

麻烦一下各位,给个思路,然后我又继续找资料学习,感谢。
12506 次点击
所在节点    PHP
54 条回复
qiayue
2016-12-30 14:58:19 +08:00
关键字:加盐
kimwang
2016-12-30 15:04:48 +08:00
@qiayue 一般情况下,有没有必要混合加密?
jimxu16
2016-12-30 15:08:22 +08:00
md5 是不可逆的
"用户登录时验证,是对输入的密码从新 md5 加密一次,然后对比数据库已 md5 加密的字符是否一致来判断"是可行的

还可以将用户的登录状态存入到 session 中
jessynt
2016-12-30 15:15:19 +08:00
看了下, LZ 发在了 PHP 节点,那就用 `password_hash` 和 `password_verify ` 吧
shiji
2016-12-30 15:18:23 +08:00
escape 是啥?从没听说过
md5 sha 是散列函数,不是加密。
base64 是编码,就像把汉字转换成电报代码,根本不能加密。

标准做法:网站强制 ssl ,用户名密码原样提交至服务器。服务端使用 bcrypt 生成散列指纹,存入数据库。

还有个比较接近中国特色的,打死不用 ssl ,服务端返回 RSA 公钥,客户端用 cryptoJS 处理密码加密提交,服务器那边再来解密。缺点是完全不可防御中间人攻击。还有直接用 AES 加密的,密钥就藏在代码里。 189 网上营业厅好像就是这么干的
xavierskip
2016-12-30 15:18:42 +08:00
1.通过哈希算法存储用户口令。哈希算法不可逆。

2.因为用户会在各个站点使用同样的口令,防止别的地方泄露的密码被暴力破解后影响到你的站点。给每个用户的口令加上一段随机生成的字符串凑在一起通过哈希算法来存储密码。保存好密码和这段随机生成的字符串,这段字符俗称『盐』。
shiji
2016-12-30 15:21:31 +08:00
如果用的是 PHP , PHP 不是古董版本,就按照 4 楼提到的那两个函数操作即可。非常符合行业标准。最靠谱
kimwang
2016-12-30 15:22:49 +08:00
@jessynt 没错,因为我准备用 PHP+MYSQL ,其它需要容器、 APP 什么的语言对我来说太难。

想知道现在程序员通常会用什么方案处理?
kimwang
2016-12-30 15:27:57 +08:00
@shiji 不好意思,我自己也比较乱,概念名词不一定说得准,有时会影响理解。

http://www.w3school.com.cn/jsref/jsref_escape.asp
我想说的是 JavaScript escape() 函数
kimwang
2016-12-30 15:31:41 +08:00
@shiji 明白,谢谢。
kimwang
2016-12-30 15:32:15 +08:00
@shiji 考虑尽量用 PHP7 ,图速度快。
kimwang
2016-12-30 15:34:39 +08:00
@xavierskip 了解,谢谢。
Eugene1024
2016-12-30 15:37:20 +08:00
登录时验证是验证输入的字符加密后和数据库中的加密字符是否相匹配,一般的加密算法如 MD5 ,网上都有代码,建议楼主可以先搜索了了解下
kimwang
2016-12-30 15:41:42 +08:00
@Eugene1024 找了一个叫“ ph pass ”的类库来了解,据说 YII 和 wordpress 都在用, MD5 不知道破解的事是不是真……
whx20202
2016-12-30 15:52:04 +08:00
@shiji 真的假的? 189 这么厉害?
ZSeptember
2016-12-30 15:56:04 +08:00
一种可行的思路,每次登录都用一个 Token ,服务端在 sesion 中保存 Token
客户端提交的是 hash(token,hash(hash(pwd),salt) 在数据库中保存的是 hash(hash(pwd),salt)
在服务端计算 hash ( token,保存的值),然后比较, 不管对错,清除 token 。

自己不是做安全的,不知道这样还有什么问题。
一般这样应该差不多了,毕竟 https 要钱。
wy315700
2016-12-30 15:58:41 +08:00
@ZSeptember
这是一个 CHAP 协议
你把 hash(hash(pwd),salt) 当做一个变量,你会发现,其实服务器这样做以后保存的是 明文,

普通的 CHAP 协议的一个问题吧,必须保存明文密码。
shiji
2016-12-30 16:01:14 +08:00
@whx20202
先去 http://login.189.cn/login
会包含这样的 JS : http://login.189.cn/bundles/jquery
beautify 一下,有如下代码:

$.fn.aesEncrypt = function(n) {
var t = CryptoJS.MD5("login.189.cn"),
i = CryptoJS.enc.Utf8.parse(t),
r = CryptoJS.enc.Utf8.parse("1234567812345678"),
u = CryptoJS.AES.encrypt(n, i, {
iv: r
});
return u + ""
};
$.fn.aesDecrypt = function(n) {
var t = CryptoJS.MD5("login.189.cn"),
i = CryptoJS.enc.Utf8.parse(t),
r = CryptoJS.enc.Utf8.parse("1234567812345678");
return CryptoJS.AES.decrypt(n, i, {
iv: r
}).toString(CryptoJS.enc.Utf8)
};
kimwang
2016-12-30 16:11:00 +08:00
https://www.zhihu.com/question/20299384

我找了一篇知乎的文章,各位有兴趣可以看看。
现在有点困惑“随机盐值”,如果盐值随机,那么验证的时候怎么跟生成的时候一样?
lisijing1221
2016-12-30 16:22:10 +08:00
@kimwang 可以把 salt 存起来, salt 作用主要就是防止彩虹表

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/331245

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX