[原创]如何使基于JAVA技术的应用更安全(1)
文章标题:[原创]如何使基于JAVA技术的应用更安全(1)顶部 fleshwound 发布于:2006-01-2512:24  [楼主][原创]如何使基于JAVA技术的应用更安全(1)
文章作者:fleshwound()
信息来源:邪恶八进制信息安全团队(www.eviloctal)
注意:本文章原创并首发于安全矩阵(SecurityMatrix)后由原创作者友情提交到邪恶八进制信息安全团队
如何使基于JAVA技术的应用更安全系列-(1)综述与JCE加密技术
作者:Fleshwound
Email:   
安全矩阵(SecurityMatrix):
1引言
如果你系统被黑客溢出了,那么你的应用程序和服务能够逃过一劫呢?如今基于J2EE的各种服务平台比比皆是,从学校的教务管理系统到大型的股票系统,从一般的个人网站到门户站点,JAVA似乎成为一种时尚(今天你JAVA了没有?),因此我觉得有必要谈谈基于JAVA应用安全的一些话题,我们的主题是:在黑客能以用户的身份访问你的系统的时候,如何使你的JAVA应用更安全。首先我们从流行的三层网络结构谈起:
2基于Java技术的三层网络结构
三层网络结构,指的是将数据处理过程分为三部分:第一层是客户端(用户界面层),提供用户与系统的友好访问;第二层是应用服务层(也叫中间层),专司业务逻辑的实现;第三层是数据服务层(数据库系统),负责数据信息的存储、访问及其优化。由于业务逻辑被提取到应用服务层,大大降低了客户端负担,因此也成为瘦客户(ThinClient)结构,三层结构在传统的二层结构的基础上增加了应用服务层,将应用逻辑单独进行处理,从而使得用户界面与应用逻辑位于不同的平台上,两者之间的通信协议由系统自行定义。通过这样的结构设计,使得应用逻辑被所有用户共享,这是两层结构应用软件与三层应用软件之间最大的区别。三层结构将表示部分和业务逻辑部分按照客户层和应用服务层相分离,客户端和应用服务层、应用服务层和数据库服务层之间的通讯、异构平台之间的数据交换等都可以通过中间件或者相关程序来实现。当数据库或者应用服务层的业务逻辑改变时,客户端并不需要改变,反之亦然,大大提高了系统模块的复用性,缩短开发周期,降低维护费用。以JavaApplet为客户
端,以JavaServlet为中间层的三层网络结构,在目前的实时网络信息平台得到了广泛的应用,其结构和一般的三层结构如图1所示:
=800)window.open('../images/10_15050_d4f304ddd1582ff.gif');"onload="if(this.width>'800')this.width='800';if(this.height>'800')this.height='800';">
3JAVA的安全盾牌-JAVA安全技术
java几乎成为网络程序的标准语言
,java给我们提供了先进的应用技术的同时,同时给我们提供了非常强大的安全技术。这些技术主要包括:
1加密和解密技术;
2JAVA源代码保护技术;
3数据完整性保护技术(数字签名和消息摘要);
4数字证书技术;
5其它更高级的技术(包括Kerberos技术和JAVAGSS-API技术等等);
Java加密扩展即JavaCryptographyExtension,简称JCE。它是Sun的加密服务软件,包含了加密和密匙生成功能。JCE是JCA(JavaCryptographyArchitecture)的一种扩展。
JCE没有规定具体的加密算法,但提供了一个框架,加密算法的具体实现可以作为服务提供者加入。除了JCE框架之外,JCE软件包还包含了SunJCE服务提供者,其中包括许多有用的密码算法和数字签名算法,例如DES、RSA、DSA、SHA、MD5等。使用JCE进行加密解密非常方便,在后面我们将详细的讲述这一技术。
4如何最大限度的保证应用的安全性
系统被挂了我们可以重装系统,但是应用程序和服务的敏感数据和信息被改了或者被盗窃了那我们只有祈祷上帝,希望攻击者能够良心发现。不过千万不要沮丧,我们可以利用JAVA为我们提供的一些武器来增强我们的信心,利用这些东西至少可以挡住99%以上的攻击行为,使我们的损失最小化。
(1) 使用JCE技术来加密敏感信息和保护敏感信息的数字摘要;
(2) 使用JAVALoggingAPI建立Ri志和审核机制;
(3) 使用JAAS进行用户身份认证和授权;
(4) 利用数字签名技术保证数据的完整性;
(5) 利用自定义的类加载器来加载加密后的JAVA类文件以抗击JAVA源代码分析和攻击;
(6) 使用JCE来构筑安全通讯协议来保证数据传输的安全。
5使用JCE技术来加密敏感信息和保护敏感信息的数字摘要
目前SUN公司的最新版本的JDK(JDK1.5)包含以下几种密码算法:
(1)DES:DES(数据加密标准)是由IBM于上世纪70年代发明的,美国G0vernment将其采纳为标准。它是一种56位分组密码。
(2)TripleDES:该算法被用来解决使用DES技术的56位时密钥Ri益减弱的强度,其方法是:使用两个密钥对明文运行DES算法三次,从而得到112位有效密钥强度。TripleDES有时称为DESede(表示加密、解密和加密这三个阶段)。
(3)AES:AES(高级加密标准)取代DES成为美国标准。它是由JoanDaemen和VincentRijmen发明的,也被称为Rinjdael算法。它是128位分组密码,密钥长度为128位、192位或256位。
(4)RC2、RC4、和RC5:这些算法来自领先的加密安全性公司RSASecurity。
(5)Blowfish:这种算法是由BruceSchneier开发的,它是一种具有从32位到448位(都是8的整数倍)可变密钥长度的分组密码,被设计用于在软件中有效实现微处理器。
(6)其它:包括RSA、MD5
、SHA、DAS等。
除此而外,由于JCE的开放性,JDK还支持第三方提供的密码算法。
在系统中,我们首先应该搞清楚的问题是:(1)该对什么数据加密?(2)选择什么样的加密算法?(3)如何实现加密?
回答这三个问题对于不同的系统有不同的说法,通常是根据应用来定的。打个比方,银行系统有两个字段:开户人帐号和开户人密码,那我们再权衡后会选择开户人密码。对于数据库系统而言,大规模加密会导致系统反映迟钝,严重影响效率。因此选择加密算法的时候必须考虑这点,对于数据加密我们用对称加密算法,对于对称加密算法密钥等信息我们可以使用公钥加密算法,对于流媒体我们可以采用流加密方法。下面我们来回答第三个问题,如何实现加密。
通过JCE使用对称加密算法的过程一般是这样的:
1引入JCE加密算法库;
2将要加密的数据变成一个字节数组;
3调用Instance建立一个Cipher实例;
4选择加密模式,调用init方法传递密钥并初始化Cipher;
5调用doFinal方法,传递要加密的字节数组进行加密;
6将加密后的字节数组转变为普通的字符串类型。
需要注意的是因为加密后的密文是未知的,其中可能出现对应于ASCII行尾符或者文件尾符的密文,因此一般在应用中我们采用BASE64编码进行处理。下面我们给出示范源代码(实际使用的代码盧i飧鲆丛拥枚啵⒁褂肂ASE64编解码):
/*
writer:fleshwound
*/
packagemyprojects.jce_smatrix;
importjava.security.*;
importjava.io.*;
publicclassJce_smatrix
{
publicstaticStrings="welcometosmatrix!";
publicJce_smatrix()
{
System.out.println("AJCEexamplebegin:\n");
System.out.println("plaintextis:"+s+"\n");
}
publicstaticvoidmain(Stringargs[])throwsException
{
Jce_smatrixjceexa=newJce_smatrix();
//初始化密钥
Instance("Blowfish");
kg.init(128);
ateKey();
//加密
Instance("Blowfish/ECB/PKCS5padding");
c.init(Cipher.ENCRYPT_MODE,key);
byte[]Bytes("UTF8");
System.out.println("beforeENCRYPT:");
for(inti=0;i<content.length;i++)
System.out.print(content[i]+"\t");
System.out.println("\n");
byte[]encrypt=c.doFinal(content);
System.out.println("afterENCRYPT:");
for(inti=0;i<encrypt.length;i++)
System.out.print(encrypt[i]+"\t");
System.out.println("\n");
System.out.println("theencrypttextis:");
System.out.println(newString(encrypt,"UTF8"));
System.out.println("\n");
//解密
c.init(Cipher.DECRYPT_MODE,key);
byte[]decrypt=c.doFinal(encrypt);
System.out.println("thedecrypttextis:");
System.out.println(newString(decrypt,"UTF8"));
System.out.println("AJCEexampleend!-fleshwound\n");
}
}
以上是一个完整的JAVA使用BLOWFISH算法加密解
密原理实例,当然这里也有些问题:就是所有的口令使用相同的密钥和相同的初始化会导致相同的密
文,这样在应用之中字典攻击可能会有用武之地(这种强人到处都是,特别喜欢暴破!)。解决的方法有一个,就是加盐(Salt,此盐非彼盐也,乃干扰噪声信息之意,夫不见信号之中有椒盐噪声呼?)。下面我们给出一段加盐的代码:
importjava.io.*;
importjava.util.*;
importjava.security.*;
publicclasssalt_smatrix{
publicstaticvoidmain(Stringargs[])throwsException{
Strings="welcometosmatrix!";
char[]passwd=args[0].toCharArray();
PBEKeySpecpbks=newPBEKeySpec(passwd);
SecretKeyFactorykf=
java源代码加密ateSecret(pbks);
byte[]salt=newbyte[8];
Randomr=newRandom();
Instance("PBEWithMD5AndDES");
PBEParameterSpecps=newPBEParameterSpec(salt,1000);
cp.init(Cipher.ENCRYPT_MODE,k,ps);
byteptext[]=s.getBytes("UTF8");
bytectext[]=cp.doFinal(ptext);
//将盐和加密结果合并在一起保存为密文
FileOutputStreamf=newFileOutputStream("saltencrypto.dat");
f.write(salt);
f.write(ctext);
//打印盐的值
for(inti=0;i<salt.length;i++){
System.out.print(salt[i]+",");
}
System.out.println("");
//打印加密结果
for(inti=0;i<ctext.length;i++){
System.out.print(ctext[i]+",");
}
}
}
使用以上的加密方法是否已经很安全呢?一般说来,还不够,要必须保证数据的完整性,我们采用的技术是数字签名。下面是一个使用MD5计算摘要的例子:
假设需要计算信息:message,
首先获得MD5实例:Instance("MD5"),
再添加要进行计算摘要的信息:middleMD.Bytes()),
再计算出MD5摘要:byte[]msgdigm=middleMD.digest(),所有的这一切是不是很简单?
我们来看个可以运行的完整例子(采用的是SHA-512算法):
importjava.security.*;
importjava.io.*;
publicclassdigest_smatrix{
publicstaticvoidmain(Stringargs[])throwsException{
System.out.println("oneexampleofdigest");
Stringx="welcometosmatrix!";
System.out.println("thetextis:"+x);
Instance("SHA-512");
m.Bytes());
bytes[]=m.digest();
Stringresult="";
for(inti=0;i<s.length;i++){
result+=HexString((0x000000ff&s[i])|
0xffffff00).substring(6);
}
System.out.println("thedigestoftext(SHA-512):");
System.out.println(result);
}
}
以上就是一些关于JCE加密和数字摘要的基本内容,如果想要了解更为详细的内容,可以在安全矩阵下载Java.Security.Solutions
地址为:/download/show.php?id=52
(下次的主题是(2)使用JAVALoggingAPI建立Ri志和审核机制-f
leshwound)
[此贴被fleshwound在2006-01-2512:34重新编辑]顶部 softbug 发布于:2006-01-2523:07  [1楼]
JAVA用的少了,不过是大厂商欺骗大客户的一个东西罢了。顶部 代码罐头 发布于:2006-01-2523:29  [2楼]
使用java构建可以比较方便的用EJB来构建起集服务
很少有应用能够和JAVA一样一开始就提供真正企业级别的框架
JAVA虽然有很多缺点,比如执行效率低下等等,
但是它为企业级的应用做了许多工作.
如果只拿JAVA来做一些其他应用应该做的事情,比如初级WEB应用
那么JAVA绝对是不如ASP和PHP来得快捷以及高效
但是JAVA的对手是ASP.NET.
和JAVA比,ASP.NET刚涉及企业架构级的应用,差的还很远.
如果想客观的评论JAVA.还是看看EJB等等东西比较好.别和我以前一样提到JAVA就说是垃圾,想想那时候我真的蛮幼稚的.顶部 alxp 发布于:2006-02-2700:30  [3楼]
反正学什么的都说自己学的东西好,我也是一样,我本身是学JAVA的,
EJB现在已经不是很主流的,现在JAVA的Hibernate比较好比EJB要强的多,我不想多说什么。````(c)Copyleft2003-2007,EvilOctalSecurityTeam.
ThisfileisdecompiledbyanunregisteredversionofChmDecompiler.
Regsiteredversiondoesnotshowthismessage.
YoucandownloadChmDecompilerat:www.zipghost/

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。