2007年12月2日星期日

JavaSecurity_002:密码学的基本概念

从古到今,人们为了保护数据想尽了各种各样的办法,所有的办法无非都是要解决以下问题:
当数据从A传到B的时候,需要保证:
(1)数据的保密性:只有B可以读取这个数据。
(2)数据的完整性:B能够确认数据在传输过程中,没有被修改过。以及发生纠纷时,A能够确认B自己是否修改过数据。
(3)数据发送者身份的确定性(数据的不可否认性):B能够确认数据的确是A发送过来的。

1. 古代如何加密数据
常用加密方法:替代和置换/移位。
典型案例:
(1)凯撒密码。
(2)“日升昌”票号的票据防伪。

2. 密钥
一个很长的二进制数,56位即2的56次方。56位已经被破解,128位相对安全些。

3. 对称密钥
加密和解密使用同样的密钥。

3.1 对称密钥的特点
(1)加密算法和解密算法是公开的,协议是安全的。
(2)加密算法足够强大,仅依靠密文不可能译出明文。
(3)安全性依赖于密钥的安全性,而不是算法的安全性。

3.2 对称加密算法:Blowfish、DES、DESede、HmacMD5、HmacSHA1
(1)DES:DES是Data Encryption Standard 数据加密标准。密钥长度为64位,56位有效。
是目前最常用的对称加密算法,但安全性较差。
(2)DESede:改进型DES算法。密钥长度112位或168位。

3.3 对称密钥的缺点
(1)密钥很长,携带不方便,容易被窃取。
(2)如何把密钥从信息提供方A传递给信息接收方B。
(3)密钥的发放数量随着参与者人数的增长而增长,密钥容易流失。

4. 非对称密钥
加密和解密使用不同的密钥。
信息接收方B事先生成一对密钥,一个用于加密,称为公钥,一个用于解密,称为私钥。B将公钥对外公布,不论是谁都可以使用这个公钥,将信息加密发送给B。
由于公钥只能用于加密,而且公钥加密的信息只能用私钥解密,因此不怀好意的人即使知道了公钥也不能解密信息。

4.1 非对称密钥的特点
(1)加密算法和解密算法是公开的,协议是安全的。
(2)加密算法足够强大,仅依靠密文不可能译出明文。
(3)安全性依赖于私钥的安全性,而不是公钥或算法的安全性。
(4)双方不需要事先专门约定用于加密和解密的密钥,解决了密钥分发问题。

4.2 非对称加密算法:RSA、DSA
(1)RSA:由Ron Rivest, Adi Shamir 和Leonard Adleman 在1978年提出了的算法(以此三人姓名的首字母命名)。密钥长度为512~2048位。是目前最常用的非对称加密算法。
(2)DSA:Digital Signature Algorithm 数字签名算法。

4.3 非对称密钥的缺点
(1)运算复杂,速度缓慢。

5. 结合对称密钥和非对称密钥的长处
使用对称密钥加密数据,使用非对称密钥加密对称密钥。
例如:A创建公钥和私钥对,公开公钥;B创建对称密钥,使用A的公钥加密对称密钥,并传递给A;A收到后,使用私钥解密,之后A和B之间就可以使用对称密钥加密数据进行通信了。

6. 使用数据摘要验证数据的完整性
消息摘要:对原始数据按照一定算法计算得到的结果,长度通常固定为16或20个字节。算法可以保证,不同的原始数据,计算出来的结果不同。
因此,消息摘要可以看作是原始数据的指纹。可以用来验证数据在传递过程中是否被篡改。

6.1 数据摘要算法:MD5、SHA
数据摘要算法也是公开的。
(1)MD5:Message-digest Algorithm 5 信息摘要算法。
我们常常在某些软件下载站点的某软件信息中看到其MD5值,它的作用就在于我们可以在下载该软件后,对下载回来的文件用专门的软件(如Windows MD5 Check等)做一次MD5校验,以确保我们获得的文件与该站点提供的文件为同一文件。
在2004年8月17日的美国加州圣巴巴拉的国际密码学会议(Crypto’2004)上,来自中国山东大学的王小云教授做了破译MD5算法的报告,公布了MD系列算法的破解结果。宣告了固若金汤的世界通行密码标准MD5的堡垒轰然倒塌,引发了密码学界的轩然大波。
(2)SHA:Secure Hash Algorithm 安全散列算法。
共有SHA-1、SHA-224、SHA-256、SHA-384 和SHA-512五种变种。
王小云教授又破解了另一国际密码SHA-1。因为SHA-1在美国等国际社会有更加广泛的应用,密码被破的消息一出,在国际社会的反响可谓石破天惊。换句话说,王小云的研究成果表明了从理论上讲电子签名可以伪造,必须及时添加限制条件,或者重新选用更为安全的密码标准,以保证电子商务的安全。

6.2 实际使用中,如何验证数据的完整性?
例如:当A传送数据给B时,同时将数据摘要传递给B;但这还不够,因为窃取者可以修改原始数据,并重新计算数据摘要。为此,需要给数据摘要进行加密,只有A和B拥有加密的密钥(密钥的分发见“5.结合对称密钥和非对称密钥的长处”)。然后,当A传送数据给B时,同时将加密的数据摘要传递给B,B收到后,就可以计算原始数据的数据摘要,然后加密数据摘要,与A传递过来的加密的数据摘要进行对比,从而验证数据的完整性。

7. 使用数字签名确定数据发送者的身份(数据的不可否认性)
数据摘要并不能确定数据是否是A发送过来的,只能确定是某个拥有同样密钥的人发来的。
使用数字签名可以解决这一问题。原理如下:
发送者使用私钥加密数据摘要(谓之数字签名),接收者使用公钥解密以验证签名是否是某个人的。
之所以对数据摘要签名,而不对原始数据签名,因为非对称加密比较慢,既然数据摘要可以唯一的代表原始数据,长度仅有16到20个字节,对它签名是再合适不过了。

8. 使用数字证书确定公钥的所有者身份
使用数字签名可以确定数据发送者的身份,但是有一个前提必须确认:数据接收方所使用的验证签名的公钥的确是数据发送者的。
使用数字证书可以解决这一问题。
数字证书的主要功能是保存公钥和某个主体(个人或机构)的对应关系。

8.1 数字证书的签发
每个人都可以创建数字证书,宣称某个公钥是某个人或机构所拥有的。用户收到这样的证书时,需要辨别其真伪。这就需要有一个权威的认证中心来帮助我们检查证书的真伪,这个权威中心就是CA (Certification Authorities),例如:Versign、Thawte。在我们的操作系统中,已经安装了这些CA的证书。
鉴定的过程是这样的:CA检查某数字证书,确定可信后,用CA的私钥在证书上签名。用户收到这样的证书后,用CA的公钥进行验证。

参考文献:
1. 《Java安全性编程实例》 徐迎晓 编著。

没有评论: