HTTP1.1使用的认证方式:
1.BASIC 认证(基本认证)
2.DIGEST 认证(摘要认证)
3.SSL 客户端认证
4.FormBase 认证(基于表单认证)
1.1 BASIC认证原理
使用HTTP协议通信时,针对身份认证环节,HTTP协议定义了基本认证过程,允许HTTP服务器对WEB浏览器进行用户身份认证。客户端向HTTP服务器发出请求时,如客户端未被认证,则HTTP服务器将通过基本认证过程对客户端的用户名及密码进行验证,以决定用户是否合法。客户端在接收到HTTP服务器的身份认证要求后,会提示用户输入用户名及密码,然后将用户名及密码以BASE64加密,加密后的密文将附加于请求信息中, 如当用户名为admin,密码为:123456时,客户端将用户名和密码用“:”合并,并将合并后的字符串用BASE64加密为密文,并于每次请求数据 时,将密文附加于请求头(Request Header)中。HTTP服务器在每次收到请求包后,根据协议取得客户端附加的用户信息(BASE64加密的用户名和密码),解开请求包,对用户名及密码进行验证,如果用户名及密码正确,则根据客户端请求,返回客户端所需要的数据;否则,返回错误代码或重新要求客户端提供用户名及密码。
1.2 BASIC认证过程
1.客户端向服务器请求数据,此时客户端尚未被验证,则客户端提供如下请求至服务器:
Get /index.html HTTP/1.0
Host:www.google.com
2.服务器向客户端发送验证请求代码401,服务器返回的数据如下:
HTTP/1.0 401 Unauthorised
Server: SokEvo/1.0
WWW-Authenticate: Basic realm=“google.com”
Content-Type: text/html
Content-Length: xxx
3.符合http1.0/1.1版本协议的软件(浏览器)收到401返回值时,将自动弹出一个登录窗口,要求用户输入用户名和密码
4. 用户输入用户名和密码后,用户名与密码以“:”串接,以BASE64加密方式加密,并将密文放入前一条请求信息中,则客户端发送的第一条请求信息则变成如下内容:
Get /index.html HTTP/1.0
Host:www.google.com
Authorization: Basic xxxxxxxxxxxxxxxxxxxxxxxxxxxx
5.服务器收到上述请求信息后,将Authorization字段后的用户信息取出、解密,将解密后的用户名及密码与用户数据库进行比较验证,如用户名及密码正确,服务器则根据请求,将所请求资源发送给客户端。
注:加密强度低,易破解。
2.1 DIGEST认证原理
1.用摘要保护密码
其遵循的基本原则是"绝对不通过网络发送明文密码”而是发送一个密码的摘要信息来取代密码I并且这摘要信息是不可逆的,即无法通过摘要信息反推出密码信息,而服务器本身是存储这个密码的(实际上,服务器点需知道密码的摘要即可) , 而客端和服务需本身都知道这个密码。这样的话服务器可以读取客户端的摘要和本身知道的密码进行同样计算得出的摘要进行比较,若匹配则验证通过。
2.用随机数防止重放攻击
摘要被截获也可能跟密码一起好用。因此,服务器要向客户端发出一个随机数nonce ,这个数会经常发生变化。让nonce参与摘要计算,这样客户端每次发送给服务器的摘要也不断变化。攻击者无法计算出下一次的摘要,也就防止了重放攻击。nonce可按时间、访问次数变化,具体方法由服务器制定。
2.2 DIGEST认证过程
1.客户端发送访问/api/employees请求。
2.服务器端返回401未验证的状态,并且在返回的信息中包含了验证方式Digest,realm的值,QOP(quality of protection)只设置成auth,nonce为一串随机值,在下面的请求中会一直使用到,当过了存活期后服务端将刷新生成一个新的nonce值;
3.客户端接受到请求返回后,将username:realm:password进行HASH运算,假设运算后的值为HA1。又将请求的路径/api/employees进行HASH运算,假设运算后的值为HA2。再将HA1:nonce:nc:cnonce:qop:HA2进行HASH运算,得到的值放在response中。这里的cnonce为客户端生成的nonce值,而nc用于统计,假设开始时为00000001,下次请求后就变成了00000002,不一定每次都加1,但是后面请求中的nc值肯定大于前一次请求中的nc值。
4.服务端收到请求后将验证nonce是否过期,如果过期,那么直接返回401,即第二步的状态。如果没有过期,那么比较nc值,如果比前一次nc值小或者前一次根本没有存储的nc值,那么也将直接返回401状态。如果前面的验证都通过,那么服务端也将按照步骤3中计算最终HASH值的步骤计算出HASH值与客户端的进行比较,然后比较客户端提交过来的HASH值与服务端计算出来的HASH进行比较,不匹配返回401,匹配获取请求的数据并返回状态200。
3.1 SSL 客户端认证原理
SSL客户端认证即http与https之间的差别,在 Http 协议之下增加一层安全协议,通过SSL对数据进行加密/解密,保证数据在网络传输中的安全,这种安全协议称为 SSL协议(Secure Sockets Layer),即安全套接层协议;SSL升级版TLS协议(Transport Layer Security),即安全传输层协议。
3.2 SSL客户端认证过程(四次握手)
1.客户端向服务器发送明文:客户端支持的加密/签名算法,握手会话密钥。
2.服务器端使用客户端支持的加密算法和会话密钥,将服务器端支持的加密算法和服务器证书公钥及随机数等信息加密传回。
3.客户端检查收到的SSL证书,并使用服务器端提供的公钥将自己的密钥信息等内容进行加密,传送给服务器端。
4.服务器端使用自己的私钥解密信息,得到客户端的私钥。成功进行密钥交换,可以开始通信。
4.1 FormBase 认证原理
基于表单的认证方法不是HTTP协议中定义的,客户端填写表单并向服务器上Web应用发送登录信息,服务器端通过信息校验验证用户身份。一般配合使用Cookie进行对 Session(会话)的管理。
4.2 FormBase 认证过程
1.客户端发送自己的用户名密码信息。
2.服务器端接受到信息,并进行校验,如果真实。则通过。
3.服务器端发送包含Session ID的Cookie,记录认证状态。
4.客户端返回包含Session ID的Cookie,使服务器端确认为真实用户。