危害身份认证
认证的实现
目前有两种通用的身份认证,基本认真和数字认证。
- 基本认证模式
浏览器使用冒号将用户名和密码连接。生成字符串username:password
,接着使用Base64加密,使用HTTP请求的Authorization Header部分发送给服务器。 - 数字认证模式
数字认证有一点复杂,需要浏览器生成一个由用户名,密码,URL组成的hash。
即使身份认证内置在HTTP协议中,出于可用性考虑,主流的网站也很少使用基本或者数字认证,通常使用表单认证。
暴力攻击
攻击者经常通过猜常用密码的方式暴力破解你的网站。
解决方案1:使用第三方认证
大公司如bat等都提供了第三方认证服务,大部分基于open authentication (OAuth) 或者 OpenID 标准。
解决方案2:集成单点登录(Single Sign-On)
如果你的系统是企业服务,考虑集成Okta,OneLogin等SSO认证。集成一个SSO服务,你通常要使用SAML(Security Assertion Markup Language),大部分 语言有成熟的SAML库。
解决方案3:提供安全的认证系统
-
验证邮箱地址
如果你有发送邮件的需求,如重置密码,你必须验证邮箱的有效性。如果你发送了过多的邮件给未验证的邮箱,那么邮箱服务商会迅速将你拉黑,因为他们对垃圾邮件 发送很敏感。
百分百确认邮箱有效的方法是发送一份包含了token的邮件,用户点击后回调你的网站,把传入的token和数据库中保存的邮件和token对比。 -
禁用一次性邮箱账号 有些用户不情愿使用邮箱,他们可能会使用一次性的邮箱服务。需要维护一次性邮箱的黑名单,防止用户使用临时邮箱进行恶意操作。
-
使用更加复杂的密码
-
对密码进行hash算法 密码在存储到数据库之前应该被加密,这将会把明文密码转换为固定长度的字符串。在用户数据密码后,将密码的hash和存储的hash进行对比。
-
hash并加盐 hash算法虽然使密码更安全,但是网上已经有很多常用的密码和机密算法被破解,这些常用的破解密码列表被称为彩虹表。黑客在得到hash的情况下(如数据库泄露), 任然能够获取密码,为了阻止黑客进行彩虹表攻击。需要为密码hash加盐,盐值是一个随机数,和密码共同决定hash结果,黑客在得到hash的情况下必须加盐重新 运算彩虹表,才能获取到密码,但是我生成的盐值都是随机的,加盐运算某一个用户的密码还有可能,但是将所有的密码都计算一遍,几乎不可能。这就大大提升了安全 系数。
-
引入多方认证(Multifactor Authentication) 为了让网站真正安全,考虑在外部增加
Multifactor Authentication(MFA)
。如app短信验证码,银行ATM机输入密码,手机银行需要人脸识别等。
阻止枚举攻击
使用图形验证码等。