- BASIC认证;
- DIGEST认证;
- SSL客户端验证;
-
疑问:
直接在request.payload中传入加密后的密码,和使用http认证哪个更安全?
- 答:其实就是在问基于表单认证和BASIC/DIGEST认证哪个更安全,如果没用https,安全性排序应该是BASIC<=表单<DIGEST,但是BASIC/DIGEST更麻烦,所以项目中更常用的还是基于表单认证(加入动态盐的不确定性从某种程度上来说是优于BASIC的,但如果黑客知道盐是用户名的话就是一样的)。使用了https就是BASIC<DIGEST<表单
- 各大网站的登录网络请求是怎么做的?
- 答:各大网站都是靠谱的https,login接口根本看不到,语雀的login接口会出现半秒左右然后消失,登录的网络请求看来是非常严谨的,暂时不清楚。
DIGEST方案如何计算响应码?js破译不是更简单吗?
HTTP使用的认证方式一览
将ID和密码组合后,以Base64方式编码后放入http请求首部发送。
- 接收到首部包含Authorization字段的服务器在验证成功后,返回一条包含Request-URI资源的响应
Basic认证不够灵活,易破解,达不到多数网站期望的安全等级,故不常用。
DIGEST认证
服务器使用了WWW-Authenticate字段,还记得么,这是第六章提过的,服务器认证相关的响应首部字段。
DIGEST认证可以防止用户密码被窃听,但是不存在防止用户伪装的机制。
SSL客户端验证
是由HTTPS客户端认证证书完成的认证。
- 感觉很麻烦,还要花钱。
总之用了https就安全了,又花钱又费事,不安全有鬼,有兴趣可以细看。
基于表单认证
认证多半是基于表单认证的。
- BASIC和DIGEST不靠谱,SSL认证太麻烦
- 没有标准化的方法
核心在于:HTTPS通信、密码加盐、cookie
- 上图的解决方案,在第一次登陆成功后,后续就用Session ID登陆了,可以减少风险。
- 用户ID和密码只需在第一次传输(加盐)。
- Session ID决不能泄露。
- 基于表单认证没有标准化的方案,这也只是一种案例。
- 为减轻跨站脚本攻击(XSS)造成的损失,建议事先在Cookie内加入httponly的属性(还记得么,加了这个属性就不能用javascript获取cookie了第六章 HTTP首部)
加盐
直接给密码编码安全性不够
- 加盐就是添加额外的信息
- 盐通常是由服务器生成的随机字符串,可以增加破译难度,我们项目采用的是纯加盐方案。