• BASIC认证;
  • DIGEST认证;
  • SSL客户端验证;
  • 基于表单认证(主流):核心是Cookie、传密码时加盐。

    疑问:

  • 直接在request.payload中传入加密后的密码,和使用http认证哪个更安全?

    • 答:其实就是在问基于表单认证和BASIC/DIGEST认证哪个更安全,如果没用https,安全性排序应该是BASIC<=表单<DIGEST,但是BASIC/DIGEST更麻烦,所以项目中更常用的还是基于表单认证(加入动态盐的不确定性从某种程度上来说是优于BASIC的,但如果黑客知道盐是用户名的话就是一样的)。使用了https就是BASIC<DIGEST<表单
  • 各大网站的登录网络请求是怎么做的?
    • 答:各大网站都是靠谱的https,login接口根本看不到,语雀的login接口会出现半秒左右然后消失,登录的网络请求看来是非常严谨的,暂时不清楚。
  • DIGEST方案如何计算响应码?js破译不是更简单吗?

    • BASIC认证、基于表单认证不一样是客户端计算加密吗!DIGEST方案本质上只是增加了破译难度,在用户名、密码双重编码的前提下,又加入了来自服务器的随机数质询码的计算,听着就很麻烦不是么。

      心得

  • HTTP使用的认证方式一览

    • BASIC认证(基本认证)
    • DIGEST认证(摘要认证)
    • SSL客户端认证
    • FormBase认证(基于表单认证)

      BASIC认证

  • 将ID和密码组合后,以Base64方式编码后放入http请求首部发送。

  • 接收到首部包含Authorization字段的服务器在验证成功后,返回一条包含Request-URI资源的响应

image.png

  • Basic认证不够灵活,易破解,达不到多数网站期望的安全等级,故不常用。

    DIGEST认证

    image.png

  • 服务器使用了WWW-Authenticate字段,还记得么,这是第六章提过的,服务器认证相关的响应首部字段。

  • DIGEST认证可以防止用户密码被窃听,但是不存在防止用户伪装的机制。

    SSL客户端验证

  • 是由HTTPS客户端认证证书完成的认证。

  • 感觉很麻烦,还要花钱。
  • 总之用了https就安全了,又花钱又费事,不安全有鬼,有兴趣可以细看。

    基于表单认证

  • 认证多半是基于表单认证的。

    • BASIC和DIGEST不靠谱,SSL认证太麻烦
  • 没有标准化的方法
  • 核心在于:HTTPS通信、密码加盐、cookie

    • image.png
    • 上图的解决方案,在第一次登陆成功后,后续就用Session ID登陆了,可以减少风险。
      • 用户ID和密码只需在第一次传输(加盐)。
      • Session ID决不能泄露。
      • 基于表单认证没有标准化的方案,这也只是一种案例。
    • 为减轻跨站脚本攻击(XSS)造成的损失,建议事先在Cookie内加入httponly的属性(还记得么,加了这个属性就不能用javascript获取cookie了第六章 HTTP首部

      加盐

      image.png
  • 直接给密码编码安全性不够

  • 加盐就是添加额外的信息
  • 盐通常是由服务器生成的随机字符串,可以增加破译难度,我们项目采用的是纯加盐方案。