密钥
由于公开了可靠安全的加密算法,密钥这一只有通信双方或一方知道的数据信息就极为重要,可以说,密钥=明文。就算作废的密钥泄露出去,攻击者也可能利用来解密历史消息。因此注销数字证书需要登记,而每次验证数字证书也要检查该证书是否已注销(和信用卡手机号等标识个人身份来发送/接收消费/语音信息的载体的注销,是一样一样的)
对称密钥被同时用于加密和解密,需要被通信双方共享,配送密钥成了问题,配送密钥的解决方案有:
- 使用公钥密钥加密 (通常的混合密码策略都使用这种方法)
- Deffie-Hellman方法配送对称密钥
- 选取一个很大的质数P, 以及它的一个生成元G,P和G不用保密
- 通信方S生成随机数A,并计算GA mod P发给通信方R;同时通信方R生成随机数B,并计算GBmod P发给通信方S
- S持有随机数A,并对A保密;R持有随机数B,并对B保密。而双方发送的GAmod P和GB mod P不用保密
- S拿到GB mod P再A次方后mod P,就是用于加密和解密的密钥,R拿到GB mod P再B次方后mod P就是密钥。配送密钥完成,除了双方自己生成的随机数A和B外,其他信息都可公开 (太牛B了!)
- 类似于公开消息的单向散列函数的值也无法倒推消息本身一样,公开了GA mod P和G、P也无法倒推A
- 很容易可以证明以上计算步骤等价于密钥 = GA×B mod P = GB×A mod P
- 质数P,生成元G等都是数论和抽象代数的知识。数学渣表示不想深究
PBE-基于口令的密码
简单说来就是将口令拼上随机数(salt,注:需要保存在安全处供解密使用)生成散列值作为密码(KEK-用来加密密钥的密钥),加密另一个需要被保护的密钥比如保存在本地的私钥。PBE是非常常用的技术
随机数
随机数有三个强度:一随机性,二不可预测性,三不可重复性
举例来说掷骰子同时满足这三个条件
由于机器生成随机数依赖于其内部状态,因此都算是伪随机数,对安全要求高的场合还会采集不可重现的环境信息加入到生成随机数的过程中,比如要求随意敲键盘移动鼠标等。
生成随机数用到了单向散列函数和加密方法,可以参见具体的ANSI X9.31
PGP的信任网络
PGP是一款有名的密码软件,最初的设计就是不信任第三方权威机构,它引入了安全网络的概念
安全网络:若A信任B的公钥,可以对B的公钥进行数字签名,其他人收到B的公钥的同时也能收到A的数字签名,相当于A公开表达了对B的信任。而C还可以对A的意见设置级别,比如若C认为A信赖的值得他完全信赖,那么C收到带有A数字签名的B的公钥,也会直接信任B的公钥,这样的传递关系构成了网络。
注意若A完全信赖B,B完全信赖C是不能推出A可以完全信赖C的,因此这种传递关系只有一层。试考虑信任网络中的公钥和数字证书的区别,某人的数字证书是其数字证书的公钥+第三方权威机构对该公钥的数字签名,也就是说唯一的第三方权威机构颁发,而PGP安全网中的公钥则包含所有信任该公钥的人/机构/团体的数字签名
对他人的数字签名(主观判断)的信任也可以分等级,还可以设置至少有n个信任等级为c的数字签名的公钥即可被信任。
这种去中心化的网络实际上也是我们下意识采用的信任模式,很容易被理解
SSL&TLS
TLS是数据传输加密协议,位于应用层协议之下。承载HTTP时被称为HTTPS,当然也可以保护SMTP/POP3等其它协议。
TLS协议工作有两个阶段:
-
握手协议:这个阶段双方要
- 确定即将使用的加密算法以及若解密失败的替代算法
- 交换数字证书(服务器可选择不要求客户端证书)
- 交换生成会话密钥需要的信息,比如公钥或Deffie-Hellman方法中的GA mod P。
握手协议阶段交换的信息都是公开的
记录协议:负责执行消息的压缩、加密和认证
还有值得一提的两点
- SSL&TLS中所协商的加密算法,散列值生成算法等算法都是可以配置替换的,实际上现在的协议和软件大多都有这种特性
- SSL&TLS不保护加密前的数据,不保护加密后的数据,实际上它只保护了通信传输阶段的信息安全
不完美的安全
- 攻易守难:防御必须不间断且所有环节无薄弱点,而攻击只要针对最虚弱的时间或最薄弱的环节
- 只有完美的密码,没有完美的人
攻击者不需要和密码算法硬碰硬,比如可以攻击存储/显示信息的电脑,攻击打印机,盗窃,翻垃圾桶,甚至冒充工作人员或政府部门直接进行欺骗和套问。如果人本身是整个链条上最不安全的一环,不管用什么样的加密认证技术都不能保证安全
END