第九章 认证与会话管理
最常用的认证方式就是用户名和密码。
1.Who am I?
认证和授权是两码事,认证目的是认出用户,授权是决定用户能干什么。
认证实际就是验证凭证的过程。 如何授权取决于认证出来的结果。
2.密码的那些事
密码必须以不可逆的加密算法,或是单向散列函数算法加密后存于数据库。
同时避免拖库后彩虹表查询,应增加salt字符串,目的是增加密码复杂度。
3.多因素认证
提高了认证的门槛
4.Session与认证
认证后需要替换一个对用户透明的凭证。这个凭证就是SessionID,
Session含义是会话,SessionID用于会话保持,一旦生命周期内被盗取,等同于账户失窃。若ID存于Cookie,
这种盗取又叫Cookie劫持,常见的劫持手段有,XSS攻击,网络Sniff,本地木马窃取。
5.Session Fixation攻击
如果登录前后,SessionID没发生变化,则存在Session Fixation攻击。
正确做法是,登录后重新生成SessionID.
6.Session 保存攻击
通过修改Cookie过期时间,让其永久存活。防御方法可以每隔一段时间强制注销Session或只允许拥有一个Session
7.单点登录(SSO)
英文全称(Single Sign On),通过风险集中化,只需要保护好一个登录点,即可处处使用认证后的身份。
缺点是登录点被破解后,损失很大, 减低风险的方法是在一些敏刚操作时要求用户再次输入密码。
目前SSO仅是登录的辅助手段。第十章 访问控制
权限控制问题可以归结为访问控制的问题。
访问控制与业务需求息息相关,并非一个单纯的安全问题。
设计安全方案时需要满足业务需求,同时牢记最小特权的黄金法则。
1.What Can I Do?
认证与授权不同,授权是建立在认证做好的基础上。
抽象的说,某个主体对某个客体需要实施某种操作,而系统对这种操作的限制就是权限控制。
例如,主体是 浏览器的一个get请求, 客体是 服务器上一个文件, 这个限制是 防火墙ACL策略。
ACL中文名是 访问控制表,里面的内容是 主体、客体、操作这三者之间的对应关系。
一般来说,基于URL的访问控制是最常见的。缺点是 任意用户只要构造出正确的URL即可访问页面。
通过把页面藏起来不是解决问题的方法,我们进一步还要“基于页面的访问控制”。
2.垂直权限管理
RBAC中文名是 基于角色的访问控制,验证权限时只需验证用户所属的角色。
常用的开发框架 Spring Security,提供两种权限管理方式,基于URL,基于method的访问控制。
很多时候我们得自己写权限管理,我们可以RABC作为依据。
3.水平权限管理
可以考虑引入 组 ,一个用户对应一个组,只有组内成员可以访问组内资源。
4.OAuth简介
OAuth和 OpenID 都致力于让互联网变得更加开放。OpenID解决的是认证问题,OAuth则更注重授权。
第十一章 加密算法与随机数
加密算法的专业性很强,本章我们的重点不是学习它们如何实现的。
相反我们重点是学习,如何正确使用它们,通常有哪些雷区。
1.概述
加密算法分为两大类:分组加密和流加密.
分组加密算法基于分组进行操作,每个分组长度可能不同。
流加密算法 基于 字节进行操作,每次处理一个字节。秘钥独立于消息,通过异或实现加密解密。
分组加密有 DES、Blowfish、IDEA、AES。
流加密有 RC4、ORYX、SEAL。针对加密算法的攻击分4种
唯密文攻击:攻击者手上只有密文,它们是使用同一加密算法和秘钥加密的。如果算法不存在缺陷,只能穷举各密文的意义。
已知明文攻击:攻击者除了得到密文外,还知道这些密文对应的明文。
选择明文攻击:攻击者有访问加密机的权利,可构造任意明文对应的密文,但现代加密算法通常会混淆各位内容,故通常用不上。
选择密文攻击:攻击者有访问加密机的权利,可构造任意密文对应的明文,这种攻击最难防范。
2.Stream Clipher Attack
本节讲解流加密算法,流加密是基于异或操作进行的,每次都只操作一个字节。但性能非常好,很受开发者欢迎。
Re_used Key Attack:使用流密码的常见错误是 使用同一个秘钥进行多次加解密。
Bit-flipping Attack:通过改变密文影响明文的阅读。解决方法是增加带有KEY的MAC(消息验证码)
通过哈希算法来实现的MAC,称为HMAC,HMAC性能较好,被广泛使用。
3.WEP 破解
最著名的针对流密码的攻击可能就是WEP秘钥的破解。
WEP采用RC4算法,上一节所讲的两种攻击方法,可用于WEP加密算法。
4.ECB 模式的缺陷
ECB模式 中文名 是 电码簿模式,最大的问题是分组独立性,未完全混淆分组间的关系,
当需要加密的明文多于一个分组的长度时,应该避免使用ECB模式。
对于ECB模式,替换某个分组密文,解密后该对应分组的明文也会被替换,其他分组不受影响。
5.Padding Oracle Attack
CBC模式被破解的案例
6.密钥管理
密码学基本原则:安全性应依赖于密钥的复杂度而不是算法的保密性
在安全领域,选择一个足够安全的算法不难,难的是密钥管理。
直接攻击加密算法的案例不多,密钥泄露的事件很多。
密钥管理中最常见的错误是,把密钥、salt等“key” 硬编码在代码中。
硬编码不符合规范,如果代码被广泛传播,或者被反编译,会导致密钥泄露。
其他开发人员可以看到代码获得密钥,如果人员流动性大,会泄露密钥。正确做法是,把密钥保存在配置文件或者数据库中,每次环境变更或正式发布时使用新的密钥和密码。
虽然当黑客入侵后,密钥管理系统也会不安全,但密钥系统主要目的是防止密钥从非正常途径泄露。
7.伪随机数问题
在重要系统中一定要使用足够强壮的随机数生成算法
伪随机数是通过数学算法生成的随机数,真随机数是通过物理方法生成的随机数比如电压波动。
不要将时间作为随机数使用,可以将时间作为生成随机数的种子,注意随机数种子一旦确定后,随机数序列也固定了。
如果对随机数种子不够放心,可以通过随机数使用MD5算法后再连接一个随机字符串再次MD5.
8.小结
重点是秘钥管理,以及生成强壮的随机数。
加密算法的选择和使用上注意
1.不要使用ECB模式
2.不要使用流密码
3.使用HMAC-SHA 代替 MD5
4.不要用同一KEY 做不同的事情
5. salt 与 IV(起始偏移) 需要随机生成
6. 不要自己实现加密算法,使用安全专家实现好的库。
7. 不要依赖系统的保密性。
选择困难时:
1.使用CBC模式的AES256用于加密
2.使用HMAC-SHA512 用于散列完整性检查
3.使用带salt的SHA-256 或 SHA-512 用于 Hashing
《白帽子讲Web安全 》 随手记(三)
最新推荐文章于 2019-10-06 04:20:39 发布