zhaoyu@home:~$

危害身份认证

认证的实现

目前有两种通用的身份认证,基本认真和数字认证。

  • 基本认证模式
    浏览器使用冒号将用户名和密码连接。生成字符串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机输入密码,手机银行需要人脸识别等。

阻止枚举攻击

使用图形验证码等。