Java加密与解密的艺术_第1页
Java加密与解密的艺术_第2页
Java加密与解密的艺术_第3页
Java加密与解密的艺术_第4页
Java加密与解密的艺术_第5页
已阅读5页,还剩89页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2016Java加密与解密的艺术学习前的准备各章内容的掌握要求第一章企业应用平安第二章密码学简介第三章Java密码学编程第四章更多密码效劳的应用实践篇综合应用篇复习篇学习前的准备学习前的准备:相关包下载:运行环境配置:eclipse、jre/jdk,环境变量设置测试组件包Junit;编码组件包CommonsCodec;支持base64、hex等编码的包JavaAPI下载或链接

书中的源码文件各章内容掌握要求第1章了解第2章清晰密码算法的分类:对称密码、非对称密码、散列函数、数字签名算法的区别和应用;重点理解分组密码中分组模式及补丁的概念;第3章理解java平台的平安提供者体系结构;结合第4章知道如何增加新的平安提供者;对java.security包、javax.crypto包里面的一些类有印象;第6章了解Base64编码,看懂代码实例第7章—第9章看懂代码实例,能够清楚编写相应密码算法的代码的流程:对称加密、非对称加密、数字签名、Hash运算;第10章了解证书及其在代码中的应用;第11章了解使用JSSE实现SSL通信的代码;平安与密码学第一章企业应用平安应用平安问题存储问题通信问题网上交易问题网络效劳交互问题移动应用效劳问题内部人为问题解决平安问题—平安技术目标保密性〔Confidentiality〕完整性〔Integrity〕可用性〔Availability〕可靠性〔Reliability〕抗否认性〔Non-Repudiation〕可控性Controllability可审查性:Auditability认证Authentication访问控制AccessControll--参考《密码学》解决平安问题—OSI平安体系结构解决平安问题—OSI平安效劳的保障机制解决平安问题—OSI平安效劳的保障机制认证效劳:用户认证机制:用户名口令、其他认证:kerberos认证;数字签名机制;访问控制效劳:根据不同用户类型访问权B限不同,进行访问控制,典型应用:RBAC,基于角色的访问控制;路由访问控制机制;数据保密性效劳:加密机制,业务流填充机制〔传输过程中参加随机数来混淆原数据〕数据完整性效劳:单向散列函数〔消息摘要算法〕抗否认性效劳:公证机制,第三方公证机构解决平安问题—TCP/IP平安体系结构解决平安问题—TCP/IP平安体系结构网络接口层平安:一般采用在两端架设加密机;网络层平安:IPSec协议〔Protocol〕,通过硬件实现,VPN传输层平安:SSL(SecuritySocketLayer)TLS(TransportLayerSecurity)WTLS(WirelessTransportLayerSecurity)应用层平安:HTTPS(HypertextTransferProtocoloverSecureSocketLayer)=SSL/TLS+HTTP解决平安问题—密码学密码学在平安方面的应用加解密数字签名数字摘要数字信封数字证书SSL、TLS协议HTTPS协议密码学与JAVAJCA、JCE、JSSE〔JAAS〕Keytool工具、JarSigner完成代码签名;全面部署应用平安防火墙VPN入侵检测病毒防护访问控制:用户认证〔数字证书〕、权限管理;数据加密:敏感数据的通信加密〔平安协议〕及存储加密;完整性保证:数字摘要〔哈希链〕;开展、定义、术语及分类第二章密码学简介对密码学的开展、定义、术语及分类的哪些内容感兴趣?对哪些知识有所了解,哪些不了解?考虑以后的开展以后会用到哪些?密码学相关定义-1密码学:研究保密通信和信息保密的学科,包括信息保密传输和信息加密存储等。密码学包括研究信息编码和隐藏的密码编码学〔Cryptography〕和研究加密信息破密或消息伪造的密码分析学〔Cryptanalyst〕两个分支。密码体制〔CryptographicSystem〕:密码学相关定义-2明文(Plaintext):待加密的信息;密文(Ciphertext):加密后的信息;加密(Encryption):将明文转换为密文的过程;加密算法(EncryptionAlgorithm):将明文转换为密文的算法;加密密钥(EncryptionKey):进行加密操作时用的密钥;解密(Decryption):将密文转换为明文的过程;解密算法(DecryptionAlgorithm):将密文转换为明文的算法;解密密钥(DecryptionKey):进行解密操作时用的密钥;密码分析(Cryptanalysis):通过密文推断明文或密钥的过程;主动攻击(ActiveAttack):攻击者非法入侵密码系统进行破坏;被动攻击(PassiveAttack):攻击者截获密文并对密文进行分析;密码学的开展史—手工加密阶段手工加密阶段:公元前1000年,周朝姜子牙:阴符和阴书;希腊的棋盘密码hello->2315

3131

34

罗马大帝凯撒使用凯撒密码加密:c≡m+k

mod

26m:1-25分别对应a-yz为0k:为整数123456789101112131415161718abcdefghIjklmnopqr192021222324250Stuvwxyz例:k=5时hello->mjqqt其他加密方式密码学的开展史—机械加密阶段第一次世界大战期间:以德国海军的无线电密码为代表,屡次被英国情报部门破译;第二次世界大战期间:转轮机最具代表性,以Enigma创造的转轮机复杂度最高。最终被英国数学家阿兰·图灵破解;密码学的开展史—计算机加密阶段计算机的开展,使得更为复杂的加密算法设计成为可能1949年信息论始祖Shannon发表了《保密系统的通信理论》,密码学由一门艺术变为一门真正的科学;1976年密码学家Diffie和Hellman发表了《密码学的新方向》,提出了密钥DH密钥交换算法,解决了密钥管理问题,公钥密码学出现;1977年,美国加密标准DES的公布,第一个完善的公钥密码体制RSA的提出;1997年美国征集新的国家密码标准AES,比利时密码学家提出的Rijndael算法入选;量子计算机和量子密码的出现;密码学分类按时间划分:古典密码学:以字符为加密单元;现代密码学:以信息块为加密单元;按算法类型划分:受限制算法:保密性基于对算法的保密;基于密钥的算法:保密性基于对密钥的保密按密码体制类型划分:对称密码体制:加密和解密使用同一个密钥非对称密码体制:加密和解密使用不同密钥按明文的处理方法:流密码:将明文逐位进行加密,逐位进行解密;分组密码:明文按照固定长度的组进行加密,密文分组进行解密,分组长度作为分组密码算法的参数;古典密码从古代到19世纪末应用的密码,核心技术是置换和替换,现代密码很多仍然是代替和换位的组合,只不过更加复杂;置换密码〔Permutation/TtranspositionCipher〕:明文的字母保持不变,但位置顺序被打乱了;替换〔代〕密码〔SubstitutionCipher〕:将明文中的字符替代成其他字符。简单替换〔单字符替换〕:从明文字母表到密文字母表一一映射的过程;同音替换:单个字符明文可以映射成密文的几个字符之一;多表替换:明文和密文之间的映射还取决于它在上下文的位置;多字母替换:明文中的字符被成组加密;对称密码-分组密码定义:古典密码的延续,加密解密过程使用同一个共享密钥;密钥也成为秘密密钥〔SecretKey〕;常用算法:DES〔64〕、3DES(也表示为DESede)、AES、IDEA〔国际数据加密算法,用于PGP协议中〕、Blowfish应用场所:1.需要通信前商定该密钥,并妥善保存该密码;因此一般是在通信过程中产生临时会话密钥,会话结束后就不存在了;2.计算速度快,因此用于大量信息的加密,PGP协议用于加密邮件和文件,使用IDEA算法实现;对称密码-流密码流〔序列〕密码:将明文按字符〔字节〕逐位进行加密,解密也是对明文逐位进行解密;常用算法:RC2、RC4、RC5应用场所:军事、外交等部门;对称密码--分组密码工作模式1.分组密码:将明文和密文分成固定长度的组进行运算的密码;分组长度为算法的一个输入参数;2.分组方式:ECB(ElectronicCodeBook):电子密码本模式mi<->ciCBC(CipherBlockChaining):密文分组链接模式mi异或ci-1作为输入加密CFB(CipherFeedBack):密文反响模式OFB(OutputFeedBack):输出反响模式CTR(Counter):计数器模式3.打补丁方式:分组密码有时会出现最后一组的长度小于分组长度的时候,如何补足长度,这时需要用到打补丁的方式:NoPadding,ISO10126Padding,OAEPPadding,PKCS1Padding,PKCS5Padding,SSL3Padding;4.分组密码长度:DES:64;3DES:168;AES:128、192、256;IDEA:64、128;Blowfish:64;

模式1.ECB

电子密码本模式27模式2.CBC密文分组链接28CBC加密CBC解密模式3.CFB密文反响29CFB加密CFB解密模式4.OFB输出反响30OFB加密OFB解密模式5.CRT计数模式31非对称密码体制—产生背景产生背景:密钥的更新和存储不能解决:对称〔分组〕密码体制中,任意两个通信双方之间需要共享一对互不相同的密钥,N个用户,需要n(n-1)/2个密钥,每个用户需要保存n-1个密钥;通信对方需要事先知道对称加密密钥对于临时通信实体,无法方便的传递密钥无法实现真正的数字签名Diffe和Hellman在1976年发表了《密码学的新方向》论文,特别研究了密钥分发问题,提出了DH密钥协商方案,该论文提出了公钥密码学思想1977年,MIT的RonRivest,AdiShamir和LenAdleman提出了可以真正用于加密数据的公钥算法,即RSA算法1985年,出现了现在流行的基于椭圆曲线构造的ECC算法非对称密码体制—构造原理公钥密码体制的建立是基于目前难解的数学问题,主要有大整数分解难题(RSA)离散对数问题(DH、DSA)椭圆曲线〔EllipticCurve〕上点域的离散对数问题(ECC)非对称密码体制—应用场所应用场所:加密:RSA,ECIES数字签名:MD5withRSA;SHA256withRSA;SHA256withDSA;SHA256withECDSA;常用于身份认证〔数字证书、数字签名验证〕;SSL通信:和对称密码一起进行保密通信,先认证双方身份,然后协商会话密钥,后期的通信信息采用会话密钥进行加密;数字信封:使用对称密钥k加密消息m的密文c,然后使用对方公钥pk加密对称密钥k得加密后的密钥k1,将密文c和加密密钥k1一起发送给对方;其他散列函数散列函数〔哈希函数、消息摘要函数、单向函数、杂凑函数〕:消息长度不受限制,散列值是短的固定长度的字符串;给定消息,计算散列值是容易的;散列函数的运算不可逆;抗弱碰撞性:一个消息和散列值,找到另一个具有相同散列值的消息是不可能的;抗强碰撞性:任意两个不同消息的散列值一定不同,MD(消息摘要算法)、SHA〔平安散列算法〕及Mac〔消息认证码算法〕国内商用密码标准公钥根底设施(PKIPublicKeyInfrastructure)是一种遵循标准的利用公钥加密技术为电子商务的开展提供一套平安根底平台的技术和标准;定义了一个基于X.509的,用于创立、分配和撤回证书的模型;定义的内容:X.509格式的证书〔X.509V3〕和证书废止列表CRL〔X.509V2〕;CA操作协议;CA管理协议;CA政策制定;系统的组成:认证中心CA、证书库、密钥备份及恢复系统、证书作废系统、应用程序接口API;密码的破解56位DES:1999年用22小时15分钟宣告破解56位的DES密钥散列函数:2004年,王小云宣告破解MD5,HAVAL-128,MD4和RIPEMD2005年,王小云宣告破解SHA-1,从理论上说明了数字签名可以伪造2008年荷兰科学家成功对两个不同的可执行文件进行了MD5碰撞,同年12月一组科研人员通过MD5碰撞生成了伪造的SSL证书SSL/TLS协议:基于CBC模式加密和RC4流加密都出现了漏洞;第三章Java密码学编程Java平安效劳组件JCA(JavaCryptographyArchitecture)Java加密体系结构提供数字签名、消息摘要、证书、密钥对生成器等密码效劳API,对应java.security包及其子包中密码相关的接口和类;JCE(JavaCryptographyExtension)Java加密扩展加密、密钥管理、密钥交换协议等密码效劳API,对应javax.crypto及其子包中的接口和类;〔参见API〕JSSE(JavaSecureSocketsExtension)Java平安套接字扩展包提供基于SSL(SecureSocketLayer)的加密功能;对应包中的接口和类;〔参见API〕JAAS(JavaAuthenticationandAuthorization)Java认证授权效劳:提供统一认证授权效劳,单点登录功能;对应的接口和类在javax.security.auth包中定义;〔参见API〕JCAJCE密码效劳APIJCA最早出现在JDK1.1中,当时只有有限的功能,包括为一些为数字签名和消息摘要而设计的API。以支持可信任签名代码模式。Java2SDK首次发布时,JCA在逻辑上既包括定义在Java2SDK中的API,也包含JCE1.2中的密码API。但当时JCE是一个可选包,它提供加密,密钥交换、MAC等与加密相关的密码API。为遵循美国密码出口法,1.2,1.3中JCE作为扩展包单独发行,从1.4开始就被集成到Java2SDK中了。框架结构:为了访问和开发Java平台的密码学功能,Java2SDK着重将JCA、JCE扩展为框架结构。除了密码相关的API,还包括一些提供者结构,以允许多种可相互作用的密码学实现,还有相关的标准和说明。JCA、JCE:定义了连接应用和实际算法实现程序的接口,无任何具体算法实现;具体算法实现打包成Provider,动态加载到JRE中。JCA、JCE设计原那么JCA设计遵循的原那么算法的独立性和可扩展性;实现的独立性和互操作性;算法独立性:通过定义密码学“引擎〔engine〕”或效劳的类型,以及定义相应的引擎类,可以获得算法的独立性。算法的可扩展性:基于提供者结构可以获得算法的可扩展性。实现的独立性:基于提供者结构可以获得实现的独立性。实现的互操作性:API设计的通用性以及基于提供者的结构可以获得实现的互操作性。加密效劳提供者CSP〔CryptographicServiceProviderCSP〕是一个或一系列程序包,它们用来实现一个或多个JCA密码效劳,Bouncycastle提供的JCE包。〔vider.BouncyCastleProvider)JCA、JCE设计原那么--结构图

应用程序APIjava.security.SecuritySignatureMessageDigestKeyPairGeneratorAlgorithmParameterGeneratorAlgorithmParametersCipherKeyAgreementKeyGeneratorSecretKeyFactoryMACSPI

密码服务提供者CSP1密码服务提供者CSP2密码服务提供者CSP3JCA、JCE设计原那么—引擎和算法引擎:JCA、JCE的API中定义的操作;例如加密操作的API由Cipher类来定义,但具体的加密算法的实现由提供者通过SPI接口来提供;查看BC的提供者类算法:提供者要实现具体某个算法时,需要实现的具体对应SPI接口;应用程序开发者只需要通过指定提供者和具体算法名称只需要调用引擎类定义的API接口,就可以完成具体的密码效劳;JCA、JCE设计原那么-API类和SPI类一个API类会对应多个SPI类引擎类的实例〔即API对象〕将对应SPI类的实例〔即SPI对象〕作为一个私有域来封装。API对象中的方法调用了对应的SPI方法,A.x()A.y()A.z()B.engineX()B.engineY()B.engineZ()JCA、JCE设计原那么-工厂方法模式getInstance()工厂方法:用于创立引擎类的实例和相应的SPI类的实例。工厂方法模式定义了一个创立对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类;由应用程序调用父类的工厂方法时指定使用哪个子类来实例化对象,如JCA、JCE中使用提供者和算法名称来指定具体的子类;密码效劳提供者包的使用JCA中如何安装、注册、使用提供者包。安装:在Classpath所定义的路径中放置提供者包或者将提供者包放到lib\ext\下。注册:在java.security文件中设置:vider.i=masterclassnamemasterclassname对应了提供者包中提供者类的全名称〔包名+类名〕通过调用10.4节中介绍的类的addProvider方法或者insertProviderAt方法来注册使用:在程序中的getInstance方法中通过传递参数的形式,使用指定的提供者,如果不指定提供者,就会按照java.security文件中定义的优先级来查找当前算法在哪个提供者包中有提供,只要找到一个对应的提供者包内有此算法的实现就返回。如何成为密码效劳提供者如何作为一个提供者为JCA提供某个或多个密码效劳对应的密码算法实现定义一个或多个对应SPI的子类,实现其中的engine方法。定义一个Provider类。安装:将自己提供的SPI子类打包,放到classpath指定的路径中或放到扩展路径中注册:在密码效劳程序中就可以使用此提供者提供的算法实现了。JCA主要类和接口Provider类Security类:管理提供者MessageDigest类:DigestInputStream类:DigestOutputStream类Key接口AlgorithmParameters类AlgorithmParameterGenerator类KeyPair类KeyPairGenerator类KeyFactory类SecureRandom类Signature类SignedObject类TimeStap类CodeSigner类KeyStore类JCE主要类和接口Mac类KeyGenerator类KeyAgreement类SecretKeyFactory类Cipher类CipherInputStream类CipherOutputStream类SealedObject类Spec包KeySpecAlgorithmParameterSpecEncodedKeySpecX509EncodedKeySpec:X.509标准公钥编码标准PKCS8EncodedKeySpec:PKCS8标准私钥编码标准SecretKeySpec类DESKeySpec类及DESedeKeySpec类证书相关的类Certificate类CertificateFactory类X509Certificate类CRL类X509CRLEntry类X509CRL类CertPath类JSSEAPIKeyManagerFactory类:管理密钥TrustManagerFactory类:管理信任材料SSLContext类:平安上下文HttpsURLConnection类;SSLSession接口:保持SSL协议网络会话状态SSLSocketFactory类:创立SSLSocket对象;SSLSocket类:表示SSL套接字的类;SSLServerSocketFactory:创立SSLServerSocket对象SSLServerSocket:表示效劳器端的SSLSocket;BouncyCastle和CommonsCodec第四章更多密码效劳的应用JCE受限算法的使用在JRE中部署权限文件下载将其中的两个文件local_policy.jar和US_export_policy.jar替换到%JRE_Home%\lib\security目录下;分清JDK和JRE运行AES实例

BouncyCastle的应用下载bcprov-ext-jdk15on-153.jar和bcprov-jdk15on-153.jar包,最新版本下载地址:支持的功能模块:PKIX、OpenSSL、SMIME和OpenPGP回忆应用新的密码效劳提供者的方法:配置方式:security文件中配置vider.<n>=<classname>类名是全名vider.11=vider.BouncyCastleProvider;将效劳提供者jar包导入到jre中〔拷贝到扩展路径下〕调用方式在程序中使用类的addProvider方法;Security.addProvider(newBouncyCastleProvider());BouncyCastle的APIJcajce的算法提供者math中主要是ec的相关运算asn1:对数据进行ASN.1编码的功能支持;X509:对X509格式数字证书的相关表示和操作的支持;ocsp:对OCSP协议的支持;util:提供了编码转换、输入输出有关工具类;crypto:除去对jca、jceBC的包结构CommonsCodecApache旗下的开源软件:主要用于编码格式的转换:〔ch.06-2-3〕Base64、二进制、十六进制、字符集、URL编码转换等;语言语音编码器;对jdk的消息摘要算法做了封装;类DigestUtils实践篇JCA、JCE,BC,Commoncdec第五章Base64编码什么是Base64编码?将二进制数据转换成ASCII字符的一种编码方式;26个小写英文字母和26个小写英文字母加0-9+/共64个字符,=为pad,所以称Base64编码;〔不是加解密〕为什么引入Base64编码?最早应用于解决网关只能传输ASCII电子邮件传输问题;解决一些不可打印字符的输出问题;可用于在HTTP环境下传递较长的标识信息字符常用的编码格式ASCIIGB2312GBKUnicodeUTF-8UTF-16Base64字符映射表

Base64编码的实现原理Base64编码实例数字证书的Base64编码格式:每隔76个字符添加一个回车换行符;

Base64编码的实现相同功能,三个提供者实现05-1sun.misc中的BASE64Decoder及BASE64Encoder;05-2BC提供的类;05-3CommonCodeC提供的org.apachemons.codec.binary.Base64;05-4-1UrlBase64CoderBC提供的org.bouncycastle.util.encoders.UrlBase64;+和/在url里面用-和_替代,用.作为填充符;05-4-2UrlBase64CoderCC提供的org.apachemons.codec.binary.Base64.encodeBase64URLSafe();没有填充符;三个提供者Base64编码的差异sun.misc:以sun和com.sun开头的包都是作为java和javax类库的根底,未被文档化,不对外公开使用,而且很多实现跟平台有关,后期可能会被删除,因此不推荐使用;后期JDK可能会实现Base64的API;BC:简单的根据Base64字符映射表做了编码转换;UrlBase64接近RFC4648(Base16,32,64)定义;CC:除了支持一般的转换,Base64还有基于RFC2045(MIME)的实现,UrlBase64遵照了RFC4648(Base16,32,64)的绝大局部定义;JCA、JCE的应用见实例综合应用篇证书操作和应用、JSSE实现SSL通信证书根底知识证书内容:查看证书证书用途:证书类型:自签名证书、CA根证书;证书的使用:浏览器中导入证书;证书编码格式:CA实例查看JCA中证书相关的类Certificate类CertificateFactory类X509Certificate类CRL类X509CRLEntry类X509CRL类CertPath类应用keytool工具管理证书和密钥生成证书Keytool–genkeypair–keyalgRSA–keysize2048–sigalgSH1withRSA–validity36000–alias–keystorezlex.keystore(可以直接-dnameCN=,OU=,O=,L=,S=,C=CN)导出证书keytooL–exportcert–alias–keystorezlex.keystore–filezlex.cer–rfc查看证书Keytool–printcert–filezlex.cer生成证书申请请求Keytool–certreq–alias-keystorezlex.keystore–filezlex.csr–v导入证书Keytool–importcert–alias–filezlex.cer–keystorezlex.keystore证书文件操作加载密钥库KeyStore

APIgetInstanc(KeyStore.getDefaultType())load()由密钥库获得私钥KeyStore

getKey()由密钥库获得证书KeyStoregetCertificate()由密钥文件加载数字证书CertificateFactoryAPIgetInstance(“x.509”);generateCertificate(in);由数字证书获得公钥Certificate

getPublicKey();实例10-1s和ssl平安通信实现SSL/TLS协议记录协议〔RecordProtocol〕:建立在TCP根底上,为高层协议提供数据封装、压缩、加解密等功能;握手协议〔HandshakeProtocol〕:建立在SSL记录协议之上,用于在实际的数据传输开始前,通信双方进行身份认证、协商加密算法、交换加密密钥;SSL握手协议--协商算法1.协商算法:SSL握手协议—验证证书2.1客户端验证效劳器证书:SSL握手协议—验证证

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论