密码安全与会话安全( 二 )


如果采用对称加密方式 , 需要浏览器在调登录api之前 , 先获取认证服务器的密钥 , 拿到密钥后对密码进行加密传输 , 经过的gateway都只能获取密文 , 密码到了认证服务器 , 认证服务器再通过密钥对密文进行解密 , 获取到密码明文 , 就可以进行密码验证 。 但有一个安全问题 , 浏览器获取密钥也会经过gateway , 如果gateway把密钥也打印到了日志中 , 密文也打印到了日志中 , 那攻击人同样可以通过日志获取明文密码 。
既然对称加密不可取 , 我们来看看非对称加密 。 浏览器登录前经过gateway获取认证服务器的公钥 , 使用公钥进行加密 , 最终密文到认证服务器 , 再通过私钥解密拿到明文密码进行密码认证 。 这种方式gateway只能拿到公钥和密文 , 无法解密 , 就算打印到日志中 , 攻击人无法拿到明文密码了 。
但这样就安全了吗?
如果攻击人拿gateway中的密文直接去调认证服务器中的登录api , 认证服务器一样可以通过私钥进行解密 , 并登录成功 。 所以我们还需要加一些限制:保证密文有过期时间 , 并且是只能使用一次 。
浏览器获取认证服务器公钥时 , 携带用户名到认证服务器 , 认证服务器生成随机数并与用户名关联 , 随机数只保存5分钟 , 随机数与公钥一起返回给浏览器 。 浏览器使用随机数加密码通过公钥一起加密调登录api , 认证服务器通过私钥解密 , 获取到明文密码与随机数 , 验证随机数的有效性与合法性 , 都正常就进行正常登录 , 比较完随机数后立刻删除随机数 , 如不正常拒绝登录 。
攻击人就算获取到了密码密文 , 公钥 , 随机数 , 也只能在5分钟之内赶在gateway正常请求登录之前 , 发起登录攻击 , 但这个难度太大 。 还有就是认证服务器保证客户端是gateway或可信的服务发起的请求 , 认证服务器可以对客户端做白名单限制 , 方式有很多种 , 在这就不一一赘述了 。
但现在就安全了吗?还真不一定 。 如果攻击人攻破了gateway , 在浏览器请求认证服务器获取公钥时 , gateway返回攻击人颁发的公钥 , 待用户输入完账号密码后 , 浏览器虽然进行了加密 , 数据到了gateway , 攻击人再通过自己的私钥进行解密拿到明文密码 , 再通过明文密码在登录页进行正常的登录 , 同样可以登录成功 。 因此浏览器也需要做安全验证 , 验证公钥的合法性 。
认证服务器可以采用CA机构颁发的公钥 , 认证服务器与浏览器都相信CA机构(做安全总得相信点东西 , 如果什么都不信任就没法做安全了 , 有永无止境的安全问题) , 通过CA机构的方式验证公钥的合法性来避免中间人篡改公钥的问题(讲得不是很清楚 , 比如CA机构是个啥 , 为什么CA机构可信?这里面可聊的话题太多 , 有兴趣可以查看《密码学与网络安全》等书籍或一起探讨研究) 。
密码安全与会话安全
文章图片
那密码安全了吗?还是远远不够 。 比如黑客知道了你密码的长度 , 可以不断地调登录或修改密码的接口来试错 , 总会试出来正确的密码 , 因此需要对任何会验证密码合法性的接口都需要加频率限制 。 如登录连续错了5次锁5分钟 , 再错5次锁半小时 , 防止黑客试出密码 。 但这种方式也有问题 。 如竞争对手公司不断地使用用户的账号和错误的密码去登录 , 导致用户的账号一直处于被锁状态 , 正常用户也没法使用 , 这就违背了安全中的可用性 。 那就需要加ip限制和验证码机制了 。 为了用户的体验性 , 可以做成第一次登录用户可以正常登录 , 错误之后 , 就需要使用验证码的方式登录 , 超过5次锁定账号 , 同一ip登录错误次数过多 , 将ip加入黑名单中 。