关于加密技术

来源:互联网 发布:铃声截取软件安卓版 编辑:程序博客网 时间:2024/06/05 23:43

      自jdk1.4开始,美国放松出口限制,一些安全相关的软件包集成到jdk中,解决了我们在企业开发中遇到的安全难题。在这些软件包中,JCE(Java Cryptography Extension)、CertPath API用于消息加密,JSSE(Java Secure Socket Extension)用于保证传输层安全,JAAS(Java Authentication and Authorization Service)则被用于认证和授权。本文将讨论JCE,也就是加密技术,主要内容有:消息摘要、对称加密、非对称加密、数字签名、数字证书。

     消息摘要

     消息摘要可用来确保消息的完整性,比如ip首部的ip_cksum字段被用来检测在发送过程ip首部是否被人篡改,下载服务器提供的软件MD5码被用来检测用户下载的软件的正确性。

    (1)在jdk1.5中,我们可以用java.security.MessageDigest生成消息摘要,这个类支持的消息摘要算法有:MD2、MD5、SHA-1、SHA-256、SHA-384、SHA-512。示例如下:

 

    (2)javax.crypto.Mac也可以生成消息摘要,它和MessageDigest的区别在于生成消息摘要的过程中,它会用到密钥(javax.crypto.KeyGenerator),如果密钥不同,即便是使用相同的算法来验证同一个消息也得不到相同的摘要值,Mac支持的消息摘要算法有:HmacMD5、HmacSHA1、HmacSHA256、HmacSHA384、HmacSHA512、PBEWith<mac>(mac为前面的几个算法之一),生成密钥所支持的算法有AES、ARCFOUR/RC4(任选其一)、Blowfish、DES、DESede、HmacMD5、HmacSHA1、HmacSHA256、HmacSHA384、HmacSHA512、RC2。示例如下:

 

     对称加密

     前面介绍的消息摘要用来确保消息的完整性,但是对消息的处理过程不可逆转,也就是说不能通过消息摘要还原出原始消息。我们需要另外一种机制,既能保证传输过程中消息的机密性,又能保证接收方能够将密文消息还原成明文消息。为了达到这个目的,最简单的方法就是对称加密:发送方和接收方共享同一个私钥,发送方用私钥加密明文,接收方用私钥解密密文。在传输的过程中,就算窃听者获得了密文,只要他没有得到私钥,就很难得到正确的消息。对称加密的加密强度取决于加密算法和私钥的长度,如果算法够好,攻击它的唯一方法就是用穷举法尝试每一个私钥,平均需要尝试(1/2)*2*n次,其中n是私钥的位数。

     生成私钥的类(javax.crypto.KeyGenerator)在上一节已经介绍了,在jdk1.5中,javax.crypto.Cipher使用私钥对明文加密,初始化这个类实例需要指定(1)加密算法(2)工作方式——比如允许一个块的加密依赖于前一个块的加密,也可以使块的加密独立于任何其它块的加密(3)填充方式——当消息长度并非加密块长度整数倍时填充什么样的字节。它们具体的值以及恰当的组合方式就不在这里讨论了,您可以到java的官方网站介绍jdk1.5安全特性的网页去了解更详细的内容。示例如下:

      非对称加密

      对称加密的关键在于保管私钥,防止窃听者获得,这项技术有一个主要缺点:通信的双方并非事先就各自持有私钥,如果由发送方生成私钥,又通过网络将私钥传递给接收方,在传输过程中很有可能会造成私钥泄露。因此在上世纪70年代,人们又发明了一种非对称加密的技术来解决这个问题。非对称加密和对称加密的区别在于发送者和接收者各自持有两个钥匙,其中一个是私有的不与其他人共享,另一个是公有的可以和任何人共享,一旦需要交换机密消息,接收者可以预先以明文的方式将公钥传给发送者,发送者使用接收者的公钥加密消息,再由接收者用它自己的私钥解密消息,整个过程中,只有公钥在网络上传输,而私钥则不会暴露在网络上,也就消除私钥泄密的可能性。公钥和私钥总是成对生成,并且不可能通过其中之一生成另一个。

      jdk1.5中,生成一对公钥和私钥的类是java.security.KeyPairGenerator,生成公钥私钥的算法有RSA、DSA。而进行加密解密的类与对称加密技术用到的类是同一个——javax.crypto.Cipher,在加密过程中,它用KeyPairGenerator生成的公钥对明文消息加密,在解密过程中,它用KeyPairGenerator生成的私钥对密文消息解密。示例如下:

 

      数字签名

      公钥加密技术仍然有个问题,假如窃听者截获了正确的公钥,并篡改成自己的公钥,一旦发送者用这个伪造的公钥加密明文消息,而这份密文又截获的话,窃听者就可以用他的私钥解密获得正确的明文消息。因此,需要另一种技术——数字签名来验证发送者所发送的消息的合法性。与公钥加密的过程相反,发送者用私钥对明文消息进行签名产生一份消息摘要,并将明文消息、公钥和消息摘要一起发送给接收者,接收者再用公钥对明文消息产生另一份消息摘要,再将两份摘要进行对比验证,由于私钥只有发送者持有,因此可以确保签名的合法性。

      jdk1.5中,java.security.Signature用来生成数字签名,这个类支持的数字签名算法有:ECDSA、MD2withRSA、MD5withRSA、NONEwithDSA、SHA1withDSA、SHA1withRSA、<digest>with<encryption>、<digest>with<encryption>、<digest>with<encryption>and<mgf>。Signature用KeyPairGenerator生成的密钥对来进行数字签名验证。示例如下:

      数字证书

      数字签名的加密强度还是不够,窃听者可以截获明文消息、数字签名和公钥,并伪造一条明文消息以及对应的数字签名和公钥,接收者收到这些伪造信息后仍然无法判断它们的来源的合法性。为了提高加密强度,我们可以让通信双方都信任的第三方机构来颁发所谓的数字证书,以此证明消息发送者的身份合法性。发送者先生成密钥对,将公钥和一些身份信息发给认证中心,认证中心核实之后再发回一个数字证书,这份证书中包含了发送者的公钥、身份信息以及认证中心的数字签名;发送者与接收者建立连接时先将数字证书发给接收者验证,接收者会根据数字签名验证数字证书是否由他所信任的认证中心颁发,一旦验证了数字证书的合法性,也就意味着发送者的身份得到确认,就保证了数字证书中发送者的公钥的合法性。引入认证中心的好处在于我们只需要事先通过非网络传输的手段持有认证中心的公钥即可,而与我们通信的其他用户的公钥则可以从网络上发送的数字证书中获得。

      java平台用密钥库(keystore)保存密钥和证书,用keytool操作密钥库,而keytool可以从密钥库中以x.509文件格式导出密钥,由认证中心签名后重新导入密钥库。受信库(truststore)用来保存认证中心或者其他可信机构的数字证书,这些证书中包含了一个公钥——用于验证认证中心签发的数字签名。下面这个例子中,我们用RSA算法生成Sender的自签名证书,然后查看所创建的证书:

      小结

      本单元主要介绍了一些加密技术:消息摘要、对称加密、非对称加密、数字签名,数字证书,这些技术能够解决很多网络安全问题。在下一单元,我们会回顾这些内容,还会讨论这些加密技术如何被应用到传输层,也就是JSSE。