您的位置:首页 > 编程语言 > Java开发

Java加密与解密的艺术-读书笔记3-4章

2015-08-08 18:13 453 查看
第3章-Java加密利器
Java安全领域组成部分:Java安全领域总共分为4个部分:JCA(Java Cryptography Architecture,Java加密体系结构)、JCE(Java Cryptography Extension Java加密扩展包)、JSSE(Java Secure Sockets Extensions Java安全套接字扩展包)、JAAS(Java Authentication and
Authentication Service Java鉴别与安全服务)
JCA和JCE并不执行任何算法,他们只是连接应用和实际算法实现的一组接口。
根据美国出口限制规定,JCA可出口,但JCE对部分国家是限制出口的。第三方的Bouncy Castle JCE就是其中的一个安全提供者。
Bouncy Castle的API是免费的。
JDK1.4版本及其后续版本中包含了上述扩展包,无须进行配置。
sun.security.rsa.SunRsaSign是实现RSA算法的提供者
安全提供者实现了两个抽象的概念:引擎和算法。引擎可以理解为操作,如加密、解密等。算法则实现了操作如何执行,如一个算法可以理解为一个引擎的具体实现。
关于出口的限制-这种出口与进口的限制主要体现在JCE和JSSE的加密算法中。DES因受到军事出口限制,目前仅提供56位的密钥长度,而实际上,安全要求则至少128位。非军事加密算法强度远不如军事加密算法强度高。
本书主要集中在java.security和javax.crypto包。

第4章-他山之石可以攻玉
受出口限制,密钥长度上不恩能够满足要求,部分算法未能支持,如MD4、SHA-224等算法;
对于出口限制,SUN通过权限文件(local_policy.jar、US_export_policy.jar)做了相应限制。但幸运的是,SUN在官方主页上提供了替换文件,可以减少相关的限制。搜索Java Cryptography Extension(JCE) Unlimited Strength Jurisdiction Policy File。
Bouncy Castle提供了一系列算法支持实现;Commons Codec并未对Java7提供扩展加密算法。仅仅是对Java7提供的API做了扩展。
配置权限文件-切换到%JDK_Home%jre\lib\security目录下,对应覆盖local_policy.jar和US_export_policy.jar两个文件。同时,你可能有必要在%JRE_HOME%lib\security目录下,也对应覆盖这两个文件。
我们在应用服务器上安装的是JRE,而不是JDK。因此有必要在应用服务器的%JRE_HOME%\lib\security目录下,对应覆盖这两个权限文件。
如果不加权限配置直接使用256位长度的密钥,就会得到名为“java.security.InvalidKeyException”的异常。
获得加密组件-我们可以下载Bouncy Castle最新的加密组件包,主要是bcprov-jdk16-149.jar和bcprov-ext-jdk16-149.jar两个文件。
扩充算法支持:
配置%JDK_HOME%\jre\lib\security\java.security文件
为了加入Bouncy Castle加密组件需要这样做:
#增加BouncyCastleProvider
security.provider.11=org.bouncycastle.jce.provider.BouncyCastleProvider
将bcprov-ext-jdk16-149.jar导入到%JDK_HOME%\jre\lib\ext目录下。
使用时需要将bcprov-jdk16-149.jar导入工程。
最后,我们只需要在初始化密钥工厂、密钥生成器等引擎类之前调用如下代码:
//加入BouncyCastleProvider支持
Security.addProvider(new BouncyCastleProvider());

1-Base64:
String
str
=
"base64编码";

System.err.println("原文:\t"+str);

byte[]
input
=
str.getBytes();

//Base64编码

byte[]
data
= Base64.encode(input);

System.err.println("编码后:\t"+new
String(data));

//Base64解码

byte[]
output
= Base64.decode(data);
System.err.println("解码后:\t"+new
String(output));
编码后的内容中,出现”=“符号,这是Base64编码的标志性符号。

2-UrlBase64:
Base64算法最初用于电子邮件系统,后经演变成为显式传递URL参数的一种编码算法,通常称为”Url Base64”。他是Base64算法的变体,将字符映射表中用作补位的”=“换成”.”,并用”-“和”_”分别替换”+”和”/“,使得Base64编码符合URL参数规则。
String
str
=
"Base64 编码";

System.err.println("原文:\t"+str);

byte[]
input
=
str.getBytes();

//Base64编码

byte[]
data
= UrlBase64.encode(input);

System.err.println("编码后:\t"+new
String(data));

//Base64解码

byte[]
output
= UrlBase64.decode(data);
System.err.println("解码后:\t"+new
String(output));
编码后的内容中,出现了”.”符号,替换掉”=“符号,符合了URL参数规则
3-Hex
Hex类用于十六进制转换。常配合消息摘要算法处理摘要值,以十六进制形式公示。
String
str
=
"Hex 编码";

System.err.println("原文:\t"+str);

byte[]
input
=
str.getBytes();

//Hex编码

byte[]
data
= Hex.encode(input);

System.err.println("编码后:\t"+new
String(data));

//Hex解码

byte[]
output
= Hex.decode(data);
System.err.println("解码后:\t"+new
String(output));
Common Codec目前提供的加密组件包版本是1.4,这是一次重大的改进。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: