什么是认证?
认证就是通过核对只有使用者知道或者持有的东西来确认使用者身份的过程。
认真核对的信息通常是以下这些:
密码:只有本人才会知道的字符串信息。
动态令牌:仅限本人持有的设备内显示的一次性密码。
数字证书:仅限本人(终端)持有的信息。
生物认证:指纹和虹膜等本人的生理信息。
IC 卡等:仅限本人持有的信息。
HTTP/1.1使用的认证方式如下:
BASIC 认证(基本认证)
DIGEST 认证(摘要认证)
SSL 客户端认证
FormBase 认证(基于表单认证)
BASIC认证:
Basic认证存在的问题:
BASIC 认证虽然采用 Base64 编码方式,但这不是加密处理。不需要任何附加信息即可对其解码。换言之,由于明文解码后就是用户 ID和密码,在 HTTP 等非加密通信的线路上进行 BASIC 认证的过程中,如果被人窃听,被盗的可能性极高。
DIGEST认证:
HTTP/1.1 开始有了DIGEST认证。DIGEST认证同样采用质询/响应的方式,但不会像BASIC认证那样直接发送明文密码。
质询响应方式是指,一开始一方会先发送认证要求给另一方,接着使用从另一方那接收到的质询码计算生成响应码。最后将响应码返回给对方进行认证的方式。
不以明文发送密码,在上述第2步时服务器响应返回随机字符串nonce,而客户端发送响应摘要 =MD5(HA1:nonce:HA2),其中HA1=MD5(username:realm:password),HA2=MD5(method:digestURI)
在HTTP 摘要认证中使用 MD5 加密是为了达成"不可逆的",也就是说,当输出已知的时候,确定原始的输入应该是相当困难的。
如果密码本身太过简单,也许可以通过尝试所有可能的输入来找到对应的输出(穷举攻击),甚至可以通过字典或者适当的查找表加快查找速度。
DIGEST 认证提供了高于 BASIC 认证的安全等级,但是和 HTTPS 的客户端认证相比仍旧很弱。DIGEST 认证提供防止密码被窃听的保护机制,但并不存在防止用户伪装的保护机制。
个人理解:Digest方式有点扯,密码被服务端知道,这种事情在互联网之初可能做的比较多,现在的网站,你敢和用户说你保存用户的密码。那用户还敢用你的服务?
SSL客户端认证:
1.得安装
2.成本问题
3.慢
参考:http://www.itcast.cn/news/20181213/14020491714.shtml
基于表单认证:
HTTP 协议标准提供的 BASIC 认证和 DIGEST 认证几乎不怎么使用。另外,SSL 客户端认证虽然具有高度的安全等级,但因为导入及维持费用等问题,还尚未普及。
Session管理以及Cookie的应用:
为减轻跨站脚本攻击(XSS)造成的损失,建议事先在 Cookie内加上 httponly 属性。(如果您在cookie中设置了HttpOnly属性,那么通过js脚本将无法读取到cookie信息,这样能有效的防止XSS攻击)
一种安全的保存方法是,先利用给密码加盐(salt)1 的方式增加额外信息,再使用散列(hash)函数计算出散列值后保存。但是我们也经常看到直接保存明文密码的做法,而这样的做法具有导致密码泄露的风险。