浅谈认证与鉴权
作者:互联网
1. 认证
认证一般用于对用户身份进行鉴别,判断其是否允许进行系统后续的操作。
1.1 Basic 认证(基本认证)
它应该是所有认证中最简单的一种方式了,注意利用用户的信息进行简单的编码来通讯。它在Http报文头中具有如下的格式:
WWW-Authenticate: Basic realm="aGVsbG86d29ybGQ=" 说明: 这里的用户名:密码为(hello:world)
其中计算方式为:
Base64(username:password)
特点:
1. 密码在通讯中传输;
2. 加密方法也很低级, 容易被破解;
1.2 Digest认证(摘要认证)
它是Basic认证的升级版,其格式如下所示:
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Digest
realm="testrealm@host.com",
qop="auth,auth-int",
nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",
opaque="5ccc069c403ebaf9f0171e9517f40e41"
Authorization: Digest
username="Mufasa", //客户端已知信息
realm="testrealm@host.com", //服务器端质询响应信息
nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", //服务器端质询响应信息
uri="/dir/index.html", //客户端已知信息
qop=auth, //服务器端质询响应信息
nc=00000001, //客户端计算出的信息
cnonce="0a4f113b", //客户端计算出的客户端nonce
response="6629fae49393a05397450978507c4ef1", //最终的摘要信息 ha3
opaque="5ccc069c403ebaf9f0171e9517f40e41" //服务器端质询响应信息
response的计算应用到了realm、qop、nonce、opaqua、uri等要素,具体的计算方式可参考其他文章详细介绍
特点:
1. 它融合了服务端、客户端的随机数,因此生成的response具备变化性;
2. 它利用随机数及nc可以减少防止重放攻击;
3. 加密方式比较固定, 因此也存在一定的风险;
1.3 WSSE认证
个人觉得它属于另外一种摘要认证形式,当然是要的算法及计算材料不一样, 以下为其报文格式:
HTTP/1.1 401 Unauthorized
WWW-Authenticate: WSSE
realm="testrealm@host.com",
profile="UsernameToken" //服务器期望你用UsernameToken规则生成回应
Authorization: WSSE profile="UsernameToken"
X-WSSE:UsernameToken
username="Mufasa",
PasswordDigest="Z2Y......",
Nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",
Created="2010-01-01T09:00:00Z"
UsernameToken规则为: 客户端生成一个nonce,然后根据该nonce,密码和当前日时来算出哈希值。
特点:
1. 服务端并没有给他返回nonce随机值;
2. 算法还利用了时间参与计算,具备更高的变化性;
3. 实际应用中为了有效防止重放攻击,server端会要求客户端同步自己的时间, 同时可以利用时间的有效性区间来判断摘要的有效性;
1.4 Ak/Sk认证
它是双端了解秘密,然后使用一种约定的算法进行摘要计算;
1.5 OAuth2认证
一种用于使用第三方平台账户登陆的认证方式。
2 鉴权
一般认证通过之后,用户可以发起对资源的访问。服务端可以使用session或者token的方式对后续用户请求进行鉴别,以判断是否具备访问该资源的权限。这在以微服务为设计思想的设计中应用较为广泛。
session方式是让服务端保存着用户端的状态信息,同时以cookie将该session标记设置回给用户,后续用户再访问时携带该session标记,服务端检查session标记是否有效来决定请求的处理;
token方式是指服务端以客户的用户名、密码等信息计算出一个字符串,称为token,并返回给用户,服务端不保存该字符串。用户在后续的请求中携带该token发送请求,服务端收到请求后,再次利用用户名、密码等其他材料计算一遍,判断携带的token是否与计算的一样,以判断是否处理该请求。广为人知的token认证的方法有JWT。
toekn值的状态有强动态和弱动态之分,强动态是指每个请求都发生变化,这时候token的计算只能依赖复杂的算法,再加上一些随机的算法材料来保障不被破解。有时会以摘要认证机制或者WSSE认证机制进行传递token,服务端及客户端分别使用同样的算法计算token,服务端进行比较和验证。弱动态token是指在一定时间内该token是不会变化的,超过时间之后token需要刷新或者由用户重新登陆,一般用于用户的登录后的一段时间内免登陆操作。token有时也会存储在服务端,有时存储的是用于计算token的材料,这些有点像自建的session行为。
3 说明
本文属于知识个人总结,欢迎指正。
标签:nonce,浅谈,认证,token,计算,鉴权,服务端,客户端 来源: https://blog.csdn.net/haohaoge_jx/article/details/116223510