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


无密码安全
密码有很多安全问题 , 复杂密码对于用户来说也挺麻烦的 , 那采用无密码技术 。 没有密码是不是就安全了呢?虽然现在可以采用指纹登录与刷脸登录 , 但新的安全问题也随之而来 。 密码是需要私密性的 , 但指纹可以从照片中获取 , 美国国防部某个官员因在拍照时露出了大拇指 , 随后就有了这个大拇指的清晰指纹图(拍照的时候不要剪刀手或点赞了 , 最好指纹对准自己吧 , 手动狗头) 。
还有就是存在不确定性 , 刷脸登录时 , 如果灯光太暗或太亮 , 脸部受伤了 , 化妆了 , 那登录能保证成功吗?脸部相似的人 , 登录时能保证区分开来吗?如果不能就违背了账号唯一性 , 日后审计也是个问题 。 还有一个问题就是不可修改 。 当密码泄露了可以修改密码 , 但你的指纹已经作为登录凭据了 , 换个手指头就好了 , 当十个手指头都用过了 , 那是不是该用脚指头了?当然无密码肯定是比有密码使用上更方便快捷 , 随着技术的发展 , 这些问题也都会解决 , 只是也会有更多的安全问题 。
我们再来看会话安全(密码安全还有各种各样的问题 , 篇幅有限 , 不再聊了) 。
会话标识存储安全
登录完成后 , 用户不可能每一次操作都需要输入密码 。 因此系统需要记录用户的登录状态 , 又称会话状态 。 常见的做法是系统保存session 。 session存入用户信息 , 生成随机数sessionId , 将sessionId返回浏览器 , 并存入浏览器的cookie中 , 下一次用户访问系统 , 携带cookie , 系统通过cookie找到session , 就可以知道用户是谁 。
密码安全与会话安全
文章图片
对于集群服务 , 用户首次登陆 , 访问的A服务器 , A服务器存入session , 下次访问到了B服务器 , B服务没有session , 认为用户没有登陆 , 提示用户需登陆 , 这是一个bug 。 我们将每台服务器都识别到有session就可以解决这个问题了 。 session存入redis , 登陆时往redis存session , 之后都从redis取session 。 或者每台服务器都有session , 每台服务器的session同步也能解决这个问题 。
密码安全与会话安全
文章图片
不管采用哪种方式 , 都有一个安全风险 , sessionId给出去了 , 不论sessionId是随机数生成还是加密算出来的字符串 , 黑客并不关心 , 黑客只关心这个字符串代表了用户的会话状态 。 黑客也不需要拿到密码只需要拿到这个字符串 , 就可以模拟用户进行诈骗 , 转账 , 发表非法政治评论等非法活动 。
保护sessionId不被非法利用与保护密码同等重要 。 大多数情况下sessionId存储在cookie中 , 我们先了解cookie 。
密码安全与会话安全
文章图片
这是登录okta后生成的其中一个cookie , 有name , value , domain , path , Expires/Max-Age , Httponly , Secure等属性 , 这里重点介绍其中几个 。
Domain:cookie对于哪个域有效 。 这个cookie的域是thoughtworks.okta.com , 则只有访问thoughtworks.okta.com下的api , 浏览器才会将该cookie发送至后端服务器 。 这个值可以包含子域 , 如设置domain为okta.com时 , 访问thoughtworks.okta.com也会带上该cookie 。 HttpOnly:当值为true时 , 告诉浏览器不能通过js访问到该cookie , 只有在发送请求到后端时 , 才会携带该cookie 。 Secure:当值为true时 , 告诉浏览器 , 只有访问协议问https的api时 , 才会携带该cookie 。 Expires/Max-Age:cookie有两种 , 本地cookie与sessioncookie 。 如果设置了cookie的过期时间则为本地cookie , 不设置为sessioncookie 。 sessioncookie的特点是没有具体的过期时间 , 随着浏览器关闭而清除 。 本地cookie即使浏览器关闭也不会清除 , 而是到了时间自动清除 。 这也是为什么关闭浏览器后再次打开浏览器有些系统需要重新登录 , 而有些不需要的原因 。知道cookie的几个特性后我们再来看看攻击人常用的几种攻击方式:XSS攻击 , csrf攻击 。