- 浏览: 10037 次
- 性别:
- 来自: 济南
文章分类
最新评论
1.java安全概述:
java的安全体系分为两部分:java2资源访问控制和java加密体系结构(JCA)。同时还提供了java安全扩展增强功能:认证和授权服务JAAS,java安全套接口扩展JSSE,java加密扩展JCE,如图:
下面分别介绍这两部分:
2.java2安全体系核心(资源访问控制)
它动态监视代码的运行,使代码只能访问有权访问的资源,从而保证系统的安全。代码的权限是通过安全规则文件(安全策略文件) 指定的,此文件是一个文本文件(后缀名为.policy),在运行程序时 或者在程序中制定要用特定的安全管理器,从特定的规则文件中读取权限。
安全规则文件用来指定特定的代码对某一资源的访问权限,一般由两部分组成:一个keystore纪录(密钥库),0个或多个grant纪录(规则项目)。
keystore "keystore_URL" ["keystore_Type"].其中keystore_URL用来指定密钥库的URL,keystore_Type指定密钥库类型,第二个参数可选。密钥库是一个私有密钥数据库和相应的数字签名,用来寻找grant纪录中指定的,签名者的公钥,如果grant纪录中指定了签名者,则必须包含keystore纪录,否则可选。
grant signedBy"签名者",codeBase"要赋予权限的代码"{
permission 权限名 “权限针对的目标” "权限名"
...
}
其中“权限针对的目标”中可用
directory/* 表示目录下的所有文件
*当前目录的所有文件
directory/-目录下的所有文件,包括子目录
- 当前目录下的所有文件,包括子目录
系统Policy文件的缺省位置为:
{java.home}/lib/security/java.policy (Solaris)
{java.home}\lib\security\java.policy (Windows)
用户Policy文件的缺省位置为:
{user.home}/.java.policy (Solaris)
{user.home}\.java.policy (Windows)
---- 其实,在实际使用中,我们可能不会象上面介绍的那么复杂,特别是在不使用数字签名时。这时,我们完全可以借鉴JDK 1.2提供给我们的现成的\jdk1.2\jre\lib\security\java.policy文件,根据我们的需要作相应的修改,本文就针对不使用数字签名情况详细说明安全策略文件的用法。
例如:
grant {
//对系统和用户目录“读”的权限
permission java.util.PropertyPermission
"user.dir", "read";
permission java.util.PropertyPermission
"user.home", "read";
permission java.util.PropertyPermission
"java.home", "read";
permission java.util.PropertyPermission
"java.class.path", "read";
permission java.util.PropertyPermission
"user.name", "read";
//对线程和线程组的操作权限
permission java.lang.RuntimePermission
"modifyThread";
permission java.lang.RuntimePermission
"modifyThreadGroup";
//操作Socket端口的各种权限
permission java.net.SocketPermission
"-", "listen";
permission java.net.SocketPermission
"-", "accept";
permission java.net.SocketPermission
"-", "connect";
permission java.net.SocketPermission "-", "read";
permission java.net.SocketPermission "-", "write";
//读写文件的权限
permission java.io.FilePermission "-", "read";
permission java.io.FilePermission "-", "write";
//退出系统的权限,例如System.exit(0)
permission java.lang.RuntimePermission "exitVM";
};
又如:keystore "${user.home}${/}.keystore
grant signedBy"sdo",codeBase"http://www.sun.com/"{
permission java.security.AllPermission;
}
使用.java.policy文件的方法主要有下面两种。
1. 使用缺省目录
---- 我们可以简单地将编辑好的.java.policy文件拷贝到windows 的USER_HOME目录,这时,所有的applet(或Java应用程序)可能都拥有某些相同的权限,使用起来简单,但不灵活(例如:对于java.io.FilePermission ,其目标类的target_name必须使用绝对路径),如果不是在企业内部网中使用,还可能存在一定安全隐患。
2. 在命令行中指定
---- 在命令行,如果我们希望传递一个Policy文件给appletviewer,还可以使用"-J-Djava.security.policy"参数来指定policy的位置:
appletviewer -J-Djava.security.
policy=pURL myApplet
---- pURL为Policy文件的位置。下面,是一个实际的例子,以当前目录的.java.policy文件所指定的安全策略运行当前目录的LanServerTalk.html(文件中装载并运行LanServerTalk.java):
appletviewer -J-Djava.security.policy
=.java.policy LanServerTalk.html
---- 这种方法使用灵活,特别是作为一个软件包在企业内部网中发布时,安装、设置和迁移软件,基本无须修改Policy文件的内容,使用起来相当简单,而且,安全许可的范围控制较精细。
3.java密码术和数字签名
加密包括“文件加密”即将存储数据进行加密,“通信加密”即对传输过程中的数据加密。
基于计算机的加密是处理 位 ,而不是字符。
java加密体系结构JCA提供用java平台进行加密的基本工具,sun公司将JCE作为JCA的扩展。其实JCA中的加密功能是有JCE实现的。
加密包括对称加密解密,非对称加密解密:
public void doEncryDeencry()throws Exception{//对称密钥
//待加密的明文
String str="hello world";
byte[]plaintext=str.getBytes("UTF8");
//生成密钥产生气,对其初始化,并生成密钥(每次产生的密钥都不相同)
KeyGenerator keygenerator=KeyGenerator.getInstance("DESede");
keygenerator.init(168);
SecretKey key=keygenerator.generateKey();
byte[] k=key.getEncoded();
System.out.println("-----------------------对称密钥------------------------");
showText(k);
//生成加密/解密对象,即使用密钥进行加密解密的对象
Cipher cipher=Cipher.getInstance("DESede");
cipher.init(Cipher.ENCRYPT_MODE,key);
byte[] encrypted=cipher.doFinal(plaintext);
System.out.println("--------------------对称密文---------------");
showText(encrypted);
//解密
cipher.init(Cipher.DECRYPT_MODE,key);
byte[] text=cipher.doFinal(encrypted);
System.out.println("---------------------明文---------------------");
String sstr=new String(text,"UTF8");
System.out.println(sstr);
}
public void doUEncryDeencry()throws Exception{//非对称密钥
String str="hello world";
byte[] paintext=str.getBytes("UTF8");
//产生密钥
KeyPairGenerator kpg=KeyPairGenerator.getInstance("RSA");
KeyPair kp=kpg.generateKeyPair();
PublicKey pk=kp.getPublic();
PrivateKey pvk=kp.getPrivate();
//生成加密解密的对象,即使用密钥的对象
Cipher cipher=Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE,pk);
byte[] encrypted=cipher.doFinal(paintext);
System.out.println("-------------------非对称密文---------------------");
showText(encrypted);
//解密
cipher.init(Cipher.DECRYPT_MODE,pvk);
byte[] text=cipher.doFinal(encrypted);
System.out.println("---------------------明文---------------------");
String sstr=new String(text,"UTF8");
System.out.println(sstr);
}
private void showText(byte[]b){
for(int i=0;i<b.length;i++){
System.out.print(b[i]+",");
if(i%8==7)
System.out.println();
}
}
密钥库:
public void keyStoreOperate()throws Exception{//密钥库操作
String str="hello world";
byte[] paintext=str.getBytes("UTF8");
KeyStore store=KeyStore.getInstance("JCEKS");
store.load(new FileInputStream("abc.ks"),"adodcl".toCharArray());//加载密钥库
//生成密钥并存入密钥库
KeyGenerator kg=KeyGenerator.getInstance("DES");
Key k=kg.generateKey();
store.setKeyEntry("exampleRSApairs",k,"adodcl1".toCharArray(),null);
//从密钥库中读取密钥
Key key=store.getKey("exampleRSApairs","adodcl1".toCharArray());//获得密钥
System.out.println(key.getAlgorithm());
//进行加密
Cipher cipher=Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE,key);
byte[] encrypted=cipher.doFinal(paintext);
System.out.println("-------------------对称密文---------------------");
showText(encrypted);
//解密
cipher.init(Cipher.DECRYPT_MODE,key);
byte[] text=cipher.doFinal(encrypted);
System.out.println("---------------------明文---------------------");
String sstr=new String(text,"UTF8");
System.out.println(sstr);
}
非对称密钥如何使用?
4.消息摘要
消息摘要是为了保证数据的完整性和所有者。信息摘要就是对数据采用单向散列函数进行计算,不可逆,唯一像MD5 。接收方可以对接收到的数据用相同的算法生成一个消息摘要,然后和发送过来的进行比较,从而可以知道是否完整。
public void doMessageDigest()throws Exception{
//要生成摘要的明文
String str="hello";
String str1="world";
byte[] b=str.getBytes("UTF8");
byte[]b1=str1.getBytes("UTF8");
//生成摘要
MessageDigest md=MessageDigest.getInstance("MD5");
md.update(b);
md.update(b1);//等同于对helloworld 生成摘要
byte[]s=md.digest();
//显示生成的摘要
String res="";
for(int i=0;i<s.length;i++){//将字节数组转换成字符串
res=res+Integer.toHexString((0x000000ff&s[i])|0xffffff00).substring(6);
}
System.out.println("------------------------消息摘要--------------------");
System.out.println(res);
}
5.消息摘要验证码
用消息摘要可以验证完整性,但是如果在中途被修改并重新生成消息摘要,则接收方不能判断。这时可以用消息摘要验证码,也就是对消息摘要再进行加密,接收方进行解密
public void macData()throws Exception{
//要生成消息验证码的明文
String str="hello world";
byte[]plaintext=str.getBytes("UTF8");
//生成对消息摘要进行加密的密钥
KeyGenerator keyg=KeyGenerator.getInstance("DES");
keyg.init(56);
SecretKey key=keyg.generateKey();
Mac m=Mac.getInstance("HmacMD5");
m.init(key);
m.update(plaintext);
byte[]encrypted=m.doFinal();
//显示生成的消息验证码
String res="";
for(int i=0;i<encrypted.length;i++){//将字节数组转换成字符串
res=res+Integer.toHexString((0x000000ff&encrypted[i])|0xffffff00).substring(6);
}
System.out.println("---------------------消息摘要验证码--------------------------");
System.out.println(res);
}
6.数字签名:
数字签名技术可以确定数据的发送方。目的是实现发送数据的完整性和非否认性,综合应用解密解密技术,消息摘要,消息摘要验证码技术。数字签名技术本身不对数据进行加密,而只是形成一个摘要,并对摘要进行加密。过程:
a.发送方生成消息摘要,然后用私钥对消息摘要进行加密,形成数字签名
b.将数字签名和消息一起发送给接收方
c.接收方将受到的消息用同样的方法进行计算生成消息摘要,同时,用公钥对传过来的消息摘要解密,和自己生成的进行比较,从而确定是否是接收方的
java中提供signature提供数字签名功能:
Signature 类用来为应用程序提供数字签名算法功能。数字签名用来保证数字数据的真实性和完整性。
在所有算法当中,数字签名可以是 NIST 标准的 DSA,它使用 DSA 和 SHA-1。可以将使用 SHA-1 消息摘要算法的 DSA 算法可指定为 SHA1withDSA。如果使用 RSA,对消息摘要算法将有多种选择,因此,可以将签名算法指定为 MD2withRSA、MD5withRSA 或 SHA1withRSA。没有默认的算法名称,所以必须为其指定名称。
与 Java Security 中其他基于算法的类一样,Signature 提供了与实现无关的算法,因此,调用方(应用程序代码)会请求特定的签名算法并将它传回给已被正确初始化的 Signature 对象。如果需要,还可以通过特定的提供程序请求特定的算法。请参见 getInstance 方法。
因此,有以下两种请求 Signature 算法对象的方法:或者仅指定算法名称,或者既指定算法名称又指定包提供程序。
如果仅指定了算法名称,则系统将确定环境中是否有所请求的算法实现,是否不止一个,是否为首选实现。
如果既指定了算法名称又指定了包提供程序,则系统将确定在请求的包中是否有该算法的实现;如果没有,则抛出异常。
Signature 对象可用来生成和验证数字签名。
使用 Signature 对象签名数据或验证签名包括以下三个阶段:
初始化,使用
初始化验证签名的公钥(请参见 initVerify),或使用
初始化签署签名的私钥(也可以选择“安全随机数生成器”),(请参见 initSign(PrivateKey) 和 initSign(PrivateKey, SecureRandom))。
更新
根据初始化类型,这可更新要签名或验证的字节。请参见 update 方法。
签署或验证所有更新字节的签名。请参见 sign 方法和 verify 方法。
注意,由于历史原因,此类是从 SignatureSpi 中抽象出来的,并进行了扩展。应用程序开发人员只需注意在此 Signature 类中定义的方法即可;超类中的所有方法都是供那些希望提供自己的数字签名算法实现的加密服务提供程序使用的。
下面是一个例子:
import java.security.Signature;
import java.security.KeyPairGenerator;
import java.security.KeyPair;
import java.security.PublicKey;
import java.security.PrivateKey;
import java.io.*;
public class SignatureTest {
public static void main(String[] args) throws Exception{
//读取要签名的数据
FileInputStream fis=new FileInputStream("D:\\hello.txt");
int len=fis.available();
byte[]sdata=new byte[len];
fis.read(sdata);
//生成私钥和公钥
KeyPairGenerator kpg=KeyPairGenerator.getInstance("RSA");//此处使用RSA算法
KeyPair kp=kpg.generateKeyPair();
PublicKey puk=kp.getPublic();
PrivateKey pvk=kp.getPrivate();
//进行数字签名
Signature sign=Signature.getInstance("MD5WithRSA");//生成Signature对象,使用MD5(生成消息摘要) 和RSA(对消息摘要进行加密和解密)
sign.initSign(pvk);//初始化签名时使用的私钥
sign.update(sdata);//传入要签名的数据 字节数组
byte[]signed=sign.sign();//进行签名,返回签名后的字节数组
//显示数字签名
for(int i=0;i<signed.length;i++){
System.out.print(signed[i]+",");
if(i%8==7)System.out.println();
}
//保存数字签名,将数字签名写入文件
FileOutputStream fos=new FileOutputStream("d:\\signed.txt");
fos.write(signed);
//保存公钥,以便验证时使用
FileOutputStream fos1=new FileOutputStream("d:\\publicKey.txt");
fos1.write(puk.getEncoded());
//进行签名验证
sign.initVerify(puk);//此处直接使用,实际网络环境中,可通过别的方法获得发送方的解密用的公钥,例如使用RMI
sign.update(sdata);//传入要验证的原始数据,网络环境中可通过传输文件获得
FileInputStream fis1=new FileInputStream("D:\\signed.txt");//取得传过来的数字签名
int num=fis1.available();
byte[] vdata=new byte[num];
fis1.read(vdata);
boolean v=sign.verify(vdata);//进行验证,实际上就是把用公钥解密后的消息摘要与原始数据生成的消息摘要进行比较此方法使sign返回到initVerify处,即update的数据清空
System.out.println(v);
//模拟传输过程中对数据进行修改
sdata[2]=11;
sign.update(sdata);
boolean v1=sign.verify(vdata);
System.out.println(v1);
}
}
7.数字证书
数字证书相当于用户网上的身份证,是PKI(public key Infrastructure)中的主要元素。数字证书由CA(认证机构)颁发,用来唯一的标识一个用户的身份,使通信双方能够确认彼此的身份,并且可以结合加密技术,从而保证了通信的安全性。数字证书包括:证书申请者的身份信息,证书申请者的公钥,身份验证机构CA数字签名。数字证书的作用是证明证书中列出的用户名称与证书中列出的公开密钥相对应。CA中心的数字签名使得攻击者不能伪造和篡改数字证书。
一个数字证书一般包括: 一个标准的X.509数字证书包含以下一些内容:
证书的版本信息;
证书的序列号,每个证书都有一个唯一的证书序列号;
证书所使用的签名算法;
证书的发行机构名称,命名规则一般采用X.500格式;
证书的有效期,现在通用的证书一般采用UTC时间格式,它的计时范围为1950-2049;
证书所有人的名称,命名规则一般采用X.500格式;
证书所有人的公开密钥;
证书发行者对证书的签名。
我理解的数字证书:数字证书主要就是包含了申请者的公钥(当然还有其他的一些身份信息),CA对这些信息进行数字签名形成数字证书。关于数字证书如何使用又是另外一个问题。数字证书可以提供验证所需的身份信息,其中的公钥(从CA处获得)可以用来对发送方的数据或者密钥进行加密
数字证书的原理是什么?数字证书采用PKI(Public Key Infrastructure)公开密钥基础架构技术,利用一对互相匹配的密钥进行加密和解密。每个用户自己设定一把特定的仅为本人所知的私有密钥(私钥),用它进行解密和签名;同时设定一把公共密钥(公钥),由本人公开,为一组用户所共享,用于加密和验证签名。当发送一份保密文件时,发送方使用接收方的公钥对数据加密,而接收方则使用自己的私钥解密,通过数字的手段保证加解密过程是一个不可逆过程,即只有用私有密钥才能解密,这样保证信息安全无误地到达目的地。用户也可以采用自己的私钥对发送信息加以处理,形成数字签名。由于私钥为本人所独有,这样可以确定发送者的身份,防止发送者对发送信息的抵赖性。接收方通过验证签名还可以判断信息是否被篡改过。在公开密钥基础架构技术中,最常用一种算法是RSA算法,其数学原理是将一个大数分解成两个质数的乘积,加密和解密用的是两个不同的密钥。即使已知明文、密文和加密密钥(公开密钥),想要推导出解密密钥(私密密钥),在计算上是不可能的。按现在的计算机技术水平,要破解目前采用的1024位RSA密钥,需要上千年的计算时间。
数字证书的使用
现有持证人甲向持证人乙传送数字信息,为了保证信息传送的真实性、完整性和不可否认性,需要对要传送的信息进行数字加密和数字签名,其传送过程如下:
(1) 甲准备好要传送的数字信息(明文)。
(2) 甲对数字信息进行哈希(hash)运算,得到一个信息摘要。
(3) 甲用自己的私钥(SK)对信息摘要进行加密得到甲的数字签名,并将其附在数字信息上。
(4) 甲随机产生一个加密密钥(DES密钥),并用此密钥对要发送的信息进行加密,形成密文。
(5) 甲用乙的公钥(PK)对刚才随机产生的加密密钥进行加密,将加密后的DES密钥连同密文一起传送给乙。
(6) 乙收到甲传送过来的密文和加过密的DES密钥,先用自己的私钥(SK)对加密的DES密钥进行解密,得到DES密钥。
(7) 乙然后用DES密钥对收到的密文进行解密,得到明文的数字信息,然后将DES密钥抛弃(即DES密钥作废)。
(8) 乙用甲的公钥(PK)对甲的数字签名进行解密,得到信息摘要。
(9) 乙用相同的hash算法对收到的明文再进行一次hash运算,得到一个新的信息摘要。
(10)乙将收到的信息摘要和新产生的信息摘要进行比较,如果一致,说明收到的信息没有被修改过。
注:这实际上和数字签名差不多,只不过对发送方的密钥又用接收方的公钥进行了了加密(由数字证书提供)
在(5)处用到的PK,是否来自乙所持有的的数字证书?若是,从何处得到该数字证书?关于此过程的加密解密,是怎样实现?
A 如何获得通讯对方的公钥并且相信此公钥是由某个身份确定的人拥有的,这就要用到电子证书。电子证书是由大家共同信任的第三方---认证中心(Certificate Authority,CA)来颁发的,有某人的身份信息、公钥和CA的数字签名。任何一个信任CA的通讯一方,都可以通过验证对方电子证书上的CA数字签名来建立起和对方的信任,并且获得对方的公钥以备使用。
数字证书的使用
每一个用户有一个各不相同的名字,一个可信的证书认证中心(CA)给每个用户分配一个唯一的名字并签发一个包含名字和用户公开密钥的证书。
如果甲想和乙通信,他首先必须从数据库中取得乙的证书,然后对它进行验证。如果他们使用相同的CA,事情就很简单。甲只需验证乙证书上CA的签名;如果他们使用不同的CA,问题就复杂了。甲必须从CA的树形结构底部开始,从底层CA往上层CA查询,一直追踪到同一个CA为止,找出共同的信任CA。
证书可以存储在网络中的数据库中。用户可以利用网络彼此交换证书。当证书撤销后,它将从证书目录中删除,然而签发此证书的CA仍保留此证书的副本,以备日后解决可能引起的纠纷。
如果用户的密钥或CA的密钥被破坏,从而导致证书的撤销。每一个CA必须保留一个已经撤销但还没有过期的证书废止列表(CRL)。当甲收到一个新证书时,首先应该从证书废止列表(CRL)中检查证书是否已经被撤销。
数字证书由谁来颁发,如何颁发?数字证书是由认证中心颁发的。
认证中心是一家能向用户签发数字证书以确认用户身份的管理机构。为了防止数字凭证的伪造,认证中心的公共密钥必须是可靠的,认证中心必须公布其公共密钥或由更高级别的认证中心提供一个电子凭证来证明其公共密钥的有效性,后一种方法导致了多级别认证中心的出现。
数字证书颁发过程如下:用户首先产生自己的密钥对,并将公共密钥及部分个人身份信息传送给认证中心。认证中心在核实身份后,将执行一些必要的步骤,以确信请求确实由用户发送而来,然后,认证中心将发给用户一个数字证书,该证书内包含用户的个人信息和他的公钥信息,同时还附有认证中心的签名信息。用户就可以使用自己的数字证书进行相关的各种活动
另附PKI/CA介绍:
PKI 就是 Public Key Infrastructure 的缩写,翻译过来就是公开密钥基础设施。它是利用公开密钥技术所构建的,解决网络安全问题的,普遍适用的一种基础设施。美国政府的一个报告中把 PKI 定义为全面解决安全问题的基础结构,从而大大扩展了 PKI 的概念。而我们认为,采用了公开密钥技术的基础设施就可以称为 PKI 。公开密钥技术也就是利用非对称算法的技术。说 PKI 是基础设施,就意味着它对信息网络的重要。将 PKI 在网络信息空间的地位与电力基础设施在工业生活中的地位进行类比非常确切。电力系统,通过伸到用户的标准插座为用户提供能源。 PKI 通过延伸到用户本地的接口,为各种应用提供安全的服务,如认证、身份识别、数字签名、加密等。从概念上讲,如果离开使用 PKI 的应用系统, PKI 本身没有任何实际的用处,正如电力系统离开电器设备也没有用一样。有了 PKI ,安全应用程序的开发者不用再关心那些复杂的数学运算和模型,而直接按照标准使用一种插座(接口)。用户也不用关心如何进行对方的身份鉴别而可以直接使用标准的插座,正如在电力基础设施上使用电吹风一样。
PKI 中最基本的元素就是数字证书。所有安全的操作主要通过证书来实现。 PKI 的硬设备还包括签置这些证书的证书机构 (CA) ,登记和批准证书签置的登记机构 (RA) ,以及存储和发布这些证书的电子目录。 PKI 中还包括证书策略,证书路径以及证书的使用者。所有这些都是 PKI 的基本元素。许多这样的基本元素有机地结合在一起就构成了 PKI 。
PKI 到底是什么,通过类比可以让我们有更好的理解。
首先看看产出。电力基础设施提供能源, PKI 提供网络安全服务。能源可以用于许多需要能源的设备,而安全服务可以为其他需要安全的应用提供保障。 PKI 可以提供的安全服务包括保密、完整、真实和不可否认。服务原理也是一个基础设施的重要特征,电力系统通过输送电子(电压)提供电能, PKI 通过传播数字证书保证安全。数字证书是一段数字,该数字说明了一个身份,是由 CA 通过数字签名获得的。任何人无法修改它,因为任何人都不能假冒 CA 但却可以验证数字证书是否正确。数字证书是可以公开的。数字证书在分发过程中没有被篡改的问题。这一点,在讨论 PKI 的安全时必须清楚。正是由于数字证书的不可修改,才使得 PKI 的管理和维护变得简单可行。
通过其组成我们从另一个侧面理解 PKI 。电力系统包括各种发电厂,连接电缆,并网控制设备,变电站,用电接口(如插座)等, PKI 包括 CA (证书机构), RA (登记机构),资料库,客户接口等。 CA 是签发证书的场所, RA 是登记的场所,资料库是管理证书的地方,客户接口是提供服务的标准接口。
系统结构也能表达一个基础设施的特征。一个发电机加两根电线可能不是电力基础结构,甚至连电力基础结构中的部件都不是。同样,一个 CA 和几个用户也不能算是 PKI 。一个不满足一定规范的 CA 可能都不能称为 PKI 的部件。 PKI 的部件的重要特点就是能够互操作。而互操作规范就是一种评判一个设备是否为 PKI 部件的一个标准。 PKI 应该是由多个可以互操作的 CA 、 RA 、资料库和众多接口组成的大的系统。
PKI 是目前唯一的能够基本全面解决安全问题的可能的方案。 PKI 通过电子证书以及管理这些电子证书的一整套设施,维持网络世界的秩序;通过提供一系列的安全服务,为网络电子商务、电子政务提供有力的安全保障。各国政府和许多民间机构都在纷纷研究和开发 PKI 产品,以望走在信息安全的前列。 PKI 同时是一个安全产品,可以成为对网络社会进行管理和维护的重要手段。谁拥有这项技术,谁就可能拥有对整个网络的控制权。 PKI 中最重要的设备就是 CA 。 CA 不仅是发放证书的机构,同时它也可以拥有密钥恢复能力。
控制 CA 和 CA 技术就非常关键。从国家安全的角度来说,“统一领导、集中管理、定点研制、专控经营、满足使用”就非常有意义。我们必须拥有自己的 CA 极其外围软件的自主的知识产权,拥有自己的,别人无法替代的位置。
为保证用户之间在网上传递信息的安全性、真实性、可靠性、完整性和不可抵赖性,不仅需要对用户的身份真实性进行验证,也需要有一个具有权威性、公正性、唯一性的机构,负责向电子商务的各个主体颁发并管理符合国内、国际安全电子交易协议标准的电子商务安全证书 , CA 体系应酝而生。
CA 机构,又称为证书授证 (Certificate Authority) 中心,是一个负责发放和管理数字证书的权威机构 , 它作为电子商务交易中受信任的第三方,承担公钥体系中公钥的合法性检验的责任。 CA 中心为每个使用公开密钥的用户发放一个数字证书,以实现公钥的分发并证明其合法性。数字证书是一个经证书授权中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件 , 作用是证明证书中列出的用户合法拥有证书中列出的公开密钥。 CA 机构的数字签名使得攻击者不能伪造和篡改证书。在 SET 交易中, CA 不仅对持卡人、商户发放证书,还要对获款的银行、网关发放证书。它负责产生、分配并管理所有参与网上交易的个体所需的数字证书,因此是安全电子交易的核心环节。
电子商务 CA 体系包括两大部分,即符合 SET 标准的 SET CA 认证体系和其他基于 X.509 的 CA 认证体系。
对于一个大型的应用环境,认证中心往往采用一种多层次的分级结构,各级的认证中心类似于各级行政机关,上级认证中心负责签发和管理下级认证中心的证书,最下一级的认证中心直接面向最终用户。
认证中心主要有以下五种功能:
• 证书的颁发
中心接收、验证用户 ( 包括下级认证中心和最终用户 ) 的数字证书的申请,将申请的内容进行备案,并根据申请的内容确定是否受理该数字证书申请。如果中心接受该数字证书申请,则进一步确定给用户颁发何种类型的证书。新证书用认证中心的私钥签名以后,发送到目录服务器供用户下载和查询。为了保证消息的完整性,返回给用户的所有应答信息都要使用认证中心的签名。
• 证书的更新
认证中心可以定期更新所有用户的证书,或者根据用户的请求来更新用户的证书。
• 证书的查询
证书的查询可以分为两类,其一是证书申请的查询,认证中心根据用户的查询请求返回当前用户证书申请的处理过程;其二是用户证书的查询,这类查询由目录服务器来完成,目录服务器根据用户的请求返回适当的证书。
(4) 证书的作废
当用户的私钥由于泄密等原因造成用户证书需要申请作废时,用户需要向认证中心提出证书作废的请求,认证中心根据用户的请求确定是否将该证书作废。另外一种证书作废的情况是证书已经过了有效期,认证中心自动将该证书作废。认证中心通过维护证书作废列表 (Certificate Revocation List,CRL) 来完成上述功能。
• 证书的归档
证书具有一定的有效期,证书过了有效期之后就将作废,但是我们不能将作废的证书简单地丢弃,因为有时我们可能需要验证以前的某个交易过程中产生的数字签名,这时我们就需要查询作废的证书。基于此类考虑,认证中心还应当具备管理作废证书和作废私钥的功能。总的说来,基于认证中心的安全方案应该很好地解决网上用户身份认证和信息安全传输问题。
java的安全体系分为两部分:java2资源访问控制和java加密体系结构(JCA)。同时还提供了java安全扩展增强功能:认证和授权服务JAAS,java安全套接口扩展JSSE,java加密扩展JCE,如图:
下面分别介绍这两部分:
2.java2安全体系核心(资源访问控制)
它动态监视代码的运行,使代码只能访问有权访问的资源,从而保证系统的安全。代码的权限是通过安全规则文件(安全策略文件) 指定的,此文件是一个文本文件(后缀名为.policy),在运行程序时 或者在程序中制定要用特定的安全管理器,从特定的规则文件中读取权限。
安全规则文件用来指定特定的代码对某一资源的访问权限,一般由两部分组成:一个keystore纪录(密钥库),0个或多个grant纪录(规则项目)。
keystore "keystore_URL" ["keystore_Type"].其中keystore_URL用来指定密钥库的URL,keystore_Type指定密钥库类型,第二个参数可选。密钥库是一个私有密钥数据库和相应的数字签名,用来寻找grant纪录中指定的,签名者的公钥,如果grant纪录中指定了签名者,则必须包含keystore纪录,否则可选。
grant signedBy"签名者",codeBase"要赋予权限的代码"{
permission 权限名 “权限针对的目标” "权限名"
...
}
其中“权限针对的目标”中可用
directory/* 表示目录下的所有文件
*当前目录的所有文件
directory/-目录下的所有文件,包括子目录
- 当前目录下的所有文件,包括子目录
系统Policy文件的缺省位置为:
{java.home}/lib/security/java.policy (Solaris)
{java.home}\lib\security\java.policy (Windows)
用户Policy文件的缺省位置为:
{user.home}/.java.policy (Solaris)
{user.home}\.java.policy (Windows)
---- 其实,在实际使用中,我们可能不会象上面介绍的那么复杂,特别是在不使用数字签名时。这时,我们完全可以借鉴JDK 1.2提供给我们的现成的\jdk1.2\jre\lib\security\java.policy文件,根据我们的需要作相应的修改,本文就针对不使用数字签名情况详细说明安全策略文件的用法。
例如:
grant {
//对系统和用户目录“读”的权限
permission java.util.PropertyPermission
"user.dir", "read";
permission java.util.PropertyPermission
"user.home", "read";
permission java.util.PropertyPermission
"java.home", "read";
permission java.util.PropertyPermission
"java.class.path", "read";
permission java.util.PropertyPermission
"user.name", "read";
//对线程和线程组的操作权限
permission java.lang.RuntimePermission
"modifyThread";
permission java.lang.RuntimePermission
"modifyThreadGroup";
//操作Socket端口的各种权限
permission java.net.SocketPermission
"-", "listen";
permission java.net.SocketPermission
"-", "accept";
permission java.net.SocketPermission
"-", "connect";
permission java.net.SocketPermission "-", "read";
permission java.net.SocketPermission "-", "write";
//读写文件的权限
permission java.io.FilePermission "-", "read";
permission java.io.FilePermission "-", "write";
//退出系统的权限,例如System.exit(0)
permission java.lang.RuntimePermission "exitVM";
};
又如:keystore "${user.home}${/}.keystore
grant signedBy"sdo",codeBase"http://www.sun.com/"{
permission java.security.AllPermission;
}
使用.java.policy文件的方法主要有下面两种。
1. 使用缺省目录
---- 我们可以简单地将编辑好的.java.policy文件拷贝到windows 的USER_HOME目录,这时,所有的applet(或Java应用程序)可能都拥有某些相同的权限,使用起来简单,但不灵活(例如:对于java.io.FilePermission ,其目标类的target_name必须使用绝对路径),如果不是在企业内部网中使用,还可能存在一定安全隐患。
2. 在命令行中指定
---- 在命令行,如果我们希望传递一个Policy文件给appletviewer,还可以使用"-J-Djava.security.policy"参数来指定policy的位置:
appletviewer -J-Djava.security.
policy=pURL myApplet
---- pURL为Policy文件的位置。下面,是一个实际的例子,以当前目录的.java.policy文件所指定的安全策略运行当前目录的LanServerTalk.html(文件中装载并运行LanServerTalk.java):
appletviewer -J-Djava.security.policy
=.java.policy LanServerTalk.html
---- 这种方法使用灵活,特别是作为一个软件包在企业内部网中发布时,安装、设置和迁移软件,基本无须修改Policy文件的内容,使用起来相当简单,而且,安全许可的范围控制较精细。
3.java密码术和数字签名
加密包括“文件加密”即将存储数据进行加密,“通信加密”即对传输过程中的数据加密。
基于计算机的加密是处理 位 ,而不是字符。
java加密体系结构JCA提供用java平台进行加密的基本工具,sun公司将JCE作为JCA的扩展。其实JCA中的加密功能是有JCE实现的。
加密包括对称加密解密,非对称加密解密:
public void doEncryDeencry()throws Exception{//对称密钥
//待加密的明文
String str="hello world";
byte[]plaintext=str.getBytes("UTF8");
//生成密钥产生气,对其初始化,并生成密钥(每次产生的密钥都不相同)
KeyGenerator keygenerator=KeyGenerator.getInstance("DESede");
keygenerator.init(168);
SecretKey key=keygenerator.generateKey();
byte[] k=key.getEncoded();
System.out.println("-----------------------对称密钥------------------------");
showText(k);
//生成加密/解密对象,即使用密钥进行加密解密的对象
Cipher cipher=Cipher.getInstance("DESede");
cipher.init(Cipher.ENCRYPT_MODE,key);
byte[] encrypted=cipher.doFinal(plaintext);
System.out.println("--------------------对称密文---------------");
showText(encrypted);
//解密
cipher.init(Cipher.DECRYPT_MODE,key);
byte[] text=cipher.doFinal(encrypted);
System.out.println("---------------------明文---------------------");
String sstr=new String(text,"UTF8");
System.out.println(sstr);
}
public void doUEncryDeencry()throws Exception{//非对称密钥
String str="hello world";
byte[] paintext=str.getBytes("UTF8");
//产生密钥
KeyPairGenerator kpg=KeyPairGenerator.getInstance("RSA");
KeyPair kp=kpg.generateKeyPair();
PublicKey pk=kp.getPublic();
PrivateKey pvk=kp.getPrivate();
//生成加密解密的对象,即使用密钥的对象
Cipher cipher=Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE,pk);
byte[] encrypted=cipher.doFinal(paintext);
System.out.println("-------------------非对称密文---------------------");
showText(encrypted);
//解密
cipher.init(Cipher.DECRYPT_MODE,pvk);
byte[] text=cipher.doFinal(encrypted);
System.out.println("---------------------明文---------------------");
String sstr=new String(text,"UTF8");
System.out.println(sstr);
}
private void showText(byte[]b){
for(int i=0;i<b.length;i++){
System.out.print(b[i]+",");
if(i%8==7)
System.out.println();
}
}
密钥库:
public void keyStoreOperate()throws Exception{//密钥库操作
String str="hello world";
byte[] paintext=str.getBytes("UTF8");
KeyStore store=KeyStore.getInstance("JCEKS");
store.load(new FileInputStream("abc.ks"),"adodcl".toCharArray());//加载密钥库
//生成密钥并存入密钥库
KeyGenerator kg=KeyGenerator.getInstance("DES");
Key k=kg.generateKey();
store.setKeyEntry("exampleRSApairs",k,"adodcl1".toCharArray(),null);
//从密钥库中读取密钥
Key key=store.getKey("exampleRSApairs","adodcl1".toCharArray());//获得密钥
System.out.println(key.getAlgorithm());
//进行加密
Cipher cipher=Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE,key);
byte[] encrypted=cipher.doFinal(paintext);
System.out.println("-------------------对称密文---------------------");
showText(encrypted);
//解密
cipher.init(Cipher.DECRYPT_MODE,key);
byte[] text=cipher.doFinal(encrypted);
System.out.println("---------------------明文---------------------");
String sstr=new String(text,"UTF8");
System.out.println(sstr);
}
非对称密钥如何使用?
4.消息摘要
消息摘要是为了保证数据的完整性和所有者。信息摘要就是对数据采用单向散列函数进行计算,不可逆,唯一像MD5 。接收方可以对接收到的数据用相同的算法生成一个消息摘要,然后和发送过来的进行比较,从而可以知道是否完整。
public void doMessageDigest()throws Exception{
//要生成摘要的明文
String str="hello";
String str1="world";
byte[] b=str.getBytes("UTF8");
byte[]b1=str1.getBytes("UTF8");
//生成摘要
MessageDigest md=MessageDigest.getInstance("MD5");
md.update(b);
md.update(b1);//等同于对helloworld 生成摘要
byte[]s=md.digest();
//显示生成的摘要
String res="";
for(int i=0;i<s.length;i++){//将字节数组转换成字符串
res=res+Integer.toHexString((0x000000ff&s[i])|0xffffff00).substring(6);
}
System.out.println("------------------------消息摘要--------------------");
System.out.println(res);
}
5.消息摘要验证码
用消息摘要可以验证完整性,但是如果在中途被修改并重新生成消息摘要,则接收方不能判断。这时可以用消息摘要验证码,也就是对消息摘要再进行加密,接收方进行解密
public void macData()throws Exception{
//要生成消息验证码的明文
String str="hello world";
byte[]plaintext=str.getBytes("UTF8");
//生成对消息摘要进行加密的密钥
KeyGenerator keyg=KeyGenerator.getInstance("DES");
keyg.init(56);
SecretKey key=keyg.generateKey();
Mac m=Mac.getInstance("HmacMD5");
m.init(key);
m.update(plaintext);
byte[]encrypted=m.doFinal();
//显示生成的消息验证码
String res="";
for(int i=0;i<encrypted.length;i++){//将字节数组转换成字符串
res=res+Integer.toHexString((0x000000ff&encrypted[i])|0xffffff00).substring(6);
}
System.out.println("---------------------消息摘要验证码--------------------------");
System.out.println(res);
}
6.数字签名:
数字签名技术可以确定数据的发送方。目的是实现发送数据的完整性和非否认性,综合应用解密解密技术,消息摘要,消息摘要验证码技术。数字签名技术本身不对数据进行加密,而只是形成一个摘要,并对摘要进行加密。过程:
a.发送方生成消息摘要,然后用私钥对消息摘要进行加密,形成数字签名
b.将数字签名和消息一起发送给接收方
c.接收方将受到的消息用同样的方法进行计算生成消息摘要,同时,用公钥对传过来的消息摘要解密,和自己生成的进行比较,从而确定是否是接收方的
java中提供signature提供数字签名功能:
Signature 类用来为应用程序提供数字签名算法功能。数字签名用来保证数字数据的真实性和完整性。
在所有算法当中,数字签名可以是 NIST 标准的 DSA,它使用 DSA 和 SHA-1。可以将使用 SHA-1 消息摘要算法的 DSA 算法可指定为 SHA1withDSA。如果使用 RSA,对消息摘要算法将有多种选择,因此,可以将签名算法指定为 MD2withRSA、MD5withRSA 或 SHA1withRSA。没有默认的算法名称,所以必须为其指定名称。
与 Java Security 中其他基于算法的类一样,Signature 提供了与实现无关的算法,因此,调用方(应用程序代码)会请求特定的签名算法并将它传回给已被正确初始化的 Signature 对象。如果需要,还可以通过特定的提供程序请求特定的算法。请参见 getInstance 方法。
因此,有以下两种请求 Signature 算法对象的方法:或者仅指定算法名称,或者既指定算法名称又指定包提供程序。
如果仅指定了算法名称,则系统将确定环境中是否有所请求的算法实现,是否不止一个,是否为首选实现。
如果既指定了算法名称又指定了包提供程序,则系统将确定在请求的包中是否有该算法的实现;如果没有,则抛出异常。
Signature 对象可用来生成和验证数字签名。
使用 Signature 对象签名数据或验证签名包括以下三个阶段:
初始化,使用
初始化验证签名的公钥(请参见 initVerify),或使用
初始化签署签名的私钥(也可以选择“安全随机数生成器”),(请参见 initSign(PrivateKey) 和 initSign(PrivateKey, SecureRandom))。
更新
根据初始化类型,这可更新要签名或验证的字节。请参见 update 方法。
签署或验证所有更新字节的签名。请参见 sign 方法和 verify 方法。
注意,由于历史原因,此类是从 SignatureSpi 中抽象出来的,并进行了扩展。应用程序开发人员只需注意在此 Signature 类中定义的方法即可;超类中的所有方法都是供那些希望提供自己的数字签名算法实现的加密服务提供程序使用的。
下面是一个例子:
import java.security.Signature;
import java.security.KeyPairGenerator;
import java.security.KeyPair;
import java.security.PublicKey;
import java.security.PrivateKey;
import java.io.*;
public class SignatureTest {
public static void main(String[] args) throws Exception{
//读取要签名的数据
FileInputStream fis=new FileInputStream("D:\\hello.txt");
int len=fis.available();
byte[]sdata=new byte[len];
fis.read(sdata);
//生成私钥和公钥
KeyPairGenerator kpg=KeyPairGenerator.getInstance("RSA");//此处使用RSA算法
KeyPair kp=kpg.generateKeyPair();
PublicKey puk=kp.getPublic();
PrivateKey pvk=kp.getPrivate();
//进行数字签名
Signature sign=Signature.getInstance("MD5WithRSA");//生成Signature对象,使用MD5(生成消息摘要) 和RSA(对消息摘要进行加密和解密)
sign.initSign(pvk);//初始化签名时使用的私钥
sign.update(sdata);//传入要签名的数据 字节数组
byte[]signed=sign.sign();//进行签名,返回签名后的字节数组
//显示数字签名
for(int i=0;i<signed.length;i++){
System.out.print(signed[i]+",");
if(i%8==7)System.out.println();
}
//保存数字签名,将数字签名写入文件
FileOutputStream fos=new FileOutputStream("d:\\signed.txt");
fos.write(signed);
//保存公钥,以便验证时使用
FileOutputStream fos1=new FileOutputStream("d:\\publicKey.txt");
fos1.write(puk.getEncoded());
//进行签名验证
sign.initVerify(puk);//此处直接使用,实际网络环境中,可通过别的方法获得发送方的解密用的公钥,例如使用RMI
sign.update(sdata);//传入要验证的原始数据,网络环境中可通过传输文件获得
FileInputStream fis1=new FileInputStream("D:\\signed.txt");//取得传过来的数字签名
int num=fis1.available();
byte[] vdata=new byte[num];
fis1.read(vdata);
boolean v=sign.verify(vdata);//进行验证,实际上就是把用公钥解密后的消息摘要与原始数据生成的消息摘要进行比较此方法使sign返回到initVerify处,即update的数据清空
System.out.println(v);
//模拟传输过程中对数据进行修改
sdata[2]=11;
sign.update(sdata);
boolean v1=sign.verify(vdata);
System.out.println(v1);
}
}
7.数字证书
数字证书相当于用户网上的身份证,是PKI(public key Infrastructure)中的主要元素。数字证书由CA(认证机构)颁发,用来唯一的标识一个用户的身份,使通信双方能够确认彼此的身份,并且可以结合加密技术,从而保证了通信的安全性。数字证书包括:证书申请者的身份信息,证书申请者的公钥,身份验证机构CA数字签名。数字证书的作用是证明证书中列出的用户名称与证书中列出的公开密钥相对应。CA中心的数字签名使得攻击者不能伪造和篡改数字证书。
一个数字证书一般包括: 一个标准的X.509数字证书包含以下一些内容:
证书的版本信息;
证书的序列号,每个证书都有一个唯一的证书序列号;
证书所使用的签名算法;
证书的发行机构名称,命名规则一般采用X.500格式;
证书的有效期,现在通用的证书一般采用UTC时间格式,它的计时范围为1950-2049;
证书所有人的名称,命名规则一般采用X.500格式;
证书所有人的公开密钥;
证书发行者对证书的签名。
我理解的数字证书:数字证书主要就是包含了申请者的公钥(当然还有其他的一些身份信息),CA对这些信息进行数字签名形成数字证书。关于数字证书如何使用又是另外一个问题。数字证书可以提供验证所需的身份信息,其中的公钥(从CA处获得)可以用来对发送方的数据或者密钥进行加密
数字证书的原理是什么?数字证书采用PKI(Public Key Infrastructure)公开密钥基础架构技术,利用一对互相匹配的密钥进行加密和解密。每个用户自己设定一把特定的仅为本人所知的私有密钥(私钥),用它进行解密和签名;同时设定一把公共密钥(公钥),由本人公开,为一组用户所共享,用于加密和验证签名。当发送一份保密文件时,发送方使用接收方的公钥对数据加密,而接收方则使用自己的私钥解密,通过数字的手段保证加解密过程是一个不可逆过程,即只有用私有密钥才能解密,这样保证信息安全无误地到达目的地。用户也可以采用自己的私钥对发送信息加以处理,形成数字签名。由于私钥为本人所独有,这样可以确定发送者的身份,防止发送者对发送信息的抵赖性。接收方通过验证签名还可以判断信息是否被篡改过。在公开密钥基础架构技术中,最常用一种算法是RSA算法,其数学原理是将一个大数分解成两个质数的乘积,加密和解密用的是两个不同的密钥。即使已知明文、密文和加密密钥(公开密钥),想要推导出解密密钥(私密密钥),在计算上是不可能的。按现在的计算机技术水平,要破解目前采用的1024位RSA密钥,需要上千年的计算时间。
数字证书的使用
现有持证人甲向持证人乙传送数字信息,为了保证信息传送的真实性、完整性和不可否认性,需要对要传送的信息进行数字加密和数字签名,其传送过程如下:
(1) 甲准备好要传送的数字信息(明文)。
(2) 甲对数字信息进行哈希(hash)运算,得到一个信息摘要。
(3) 甲用自己的私钥(SK)对信息摘要进行加密得到甲的数字签名,并将其附在数字信息上。
(4) 甲随机产生一个加密密钥(DES密钥),并用此密钥对要发送的信息进行加密,形成密文。
(5) 甲用乙的公钥(PK)对刚才随机产生的加密密钥进行加密,将加密后的DES密钥连同密文一起传送给乙。
(6) 乙收到甲传送过来的密文和加过密的DES密钥,先用自己的私钥(SK)对加密的DES密钥进行解密,得到DES密钥。
(7) 乙然后用DES密钥对收到的密文进行解密,得到明文的数字信息,然后将DES密钥抛弃(即DES密钥作废)。
(8) 乙用甲的公钥(PK)对甲的数字签名进行解密,得到信息摘要。
(9) 乙用相同的hash算法对收到的明文再进行一次hash运算,得到一个新的信息摘要。
(10)乙将收到的信息摘要和新产生的信息摘要进行比较,如果一致,说明收到的信息没有被修改过。
注:这实际上和数字签名差不多,只不过对发送方的密钥又用接收方的公钥进行了了加密(由数字证书提供)
在(5)处用到的PK,是否来自乙所持有的的数字证书?若是,从何处得到该数字证书?关于此过程的加密解密,是怎样实现?
A 如何获得通讯对方的公钥并且相信此公钥是由某个身份确定的人拥有的,这就要用到电子证书。电子证书是由大家共同信任的第三方---认证中心(Certificate Authority,CA)来颁发的,有某人的身份信息、公钥和CA的数字签名。任何一个信任CA的通讯一方,都可以通过验证对方电子证书上的CA数字签名来建立起和对方的信任,并且获得对方的公钥以备使用。
数字证书的使用
每一个用户有一个各不相同的名字,一个可信的证书认证中心(CA)给每个用户分配一个唯一的名字并签发一个包含名字和用户公开密钥的证书。
如果甲想和乙通信,他首先必须从数据库中取得乙的证书,然后对它进行验证。如果他们使用相同的CA,事情就很简单。甲只需验证乙证书上CA的签名;如果他们使用不同的CA,问题就复杂了。甲必须从CA的树形结构底部开始,从底层CA往上层CA查询,一直追踪到同一个CA为止,找出共同的信任CA。
证书可以存储在网络中的数据库中。用户可以利用网络彼此交换证书。当证书撤销后,它将从证书目录中删除,然而签发此证书的CA仍保留此证书的副本,以备日后解决可能引起的纠纷。
如果用户的密钥或CA的密钥被破坏,从而导致证书的撤销。每一个CA必须保留一个已经撤销但还没有过期的证书废止列表(CRL)。当甲收到一个新证书时,首先应该从证书废止列表(CRL)中检查证书是否已经被撤销。
数字证书由谁来颁发,如何颁发?数字证书是由认证中心颁发的。
认证中心是一家能向用户签发数字证书以确认用户身份的管理机构。为了防止数字凭证的伪造,认证中心的公共密钥必须是可靠的,认证中心必须公布其公共密钥或由更高级别的认证中心提供一个电子凭证来证明其公共密钥的有效性,后一种方法导致了多级别认证中心的出现。
数字证书颁发过程如下:用户首先产生自己的密钥对,并将公共密钥及部分个人身份信息传送给认证中心。认证中心在核实身份后,将执行一些必要的步骤,以确信请求确实由用户发送而来,然后,认证中心将发给用户一个数字证书,该证书内包含用户的个人信息和他的公钥信息,同时还附有认证中心的签名信息。用户就可以使用自己的数字证书进行相关的各种活动
另附PKI/CA介绍:
PKI 就是 Public Key Infrastructure 的缩写,翻译过来就是公开密钥基础设施。它是利用公开密钥技术所构建的,解决网络安全问题的,普遍适用的一种基础设施。美国政府的一个报告中把 PKI 定义为全面解决安全问题的基础结构,从而大大扩展了 PKI 的概念。而我们认为,采用了公开密钥技术的基础设施就可以称为 PKI 。公开密钥技术也就是利用非对称算法的技术。说 PKI 是基础设施,就意味着它对信息网络的重要。将 PKI 在网络信息空间的地位与电力基础设施在工业生活中的地位进行类比非常确切。电力系统,通过伸到用户的标准插座为用户提供能源。 PKI 通过延伸到用户本地的接口,为各种应用提供安全的服务,如认证、身份识别、数字签名、加密等。从概念上讲,如果离开使用 PKI 的应用系统, PKI 本身没有任何实际的用处,正如电力系统离开电器设备也没有用一样。有了 PKI ,安全应用程序的开发者不用再关心那些复杂的数学运算和模型,而直接按照标准使用一种插座(接口)。用户也不用关心如何进行对方的身份鉴别而可以直接使用标准的插座,正如在电力基础设施上使用电吹风一样。
PKI 中最基本的元素就是数字证书。所有安全的操作主要通过证书来实现。 PKI 的硬设备还包括签置这些证书的证书机构 (CA) ,登记和批准证书签置的登记机构 (RA) ,以及存储和发布这些证书的电子目录。 PKI 中还包括证书策略,证书路径以及证书的使用者。所有这些都是 PKI 的基本元素。许多这样的基本元素有机地结合在一起就构成了 PKI 。
PKI 到底是什么,通过类比可以让我们有更好的理解。
首先看看产出。电力基础设施提供能源, PKI 提供网络安全服务。能源可以用于许多需要能源的设备,而安全服务可以为其他需要安全的应用提供保障。 PKI 可以提供的安全服务包括保密、完整、真实和不可否认。服务原理也是一个基础设施的重要特征,电力系统通过输送电子(电压)提供电能, PKI 通过传播数字证书保证安全。数字证书是一段数字,该数字说明了一个身份,是由 CA 通过数字签名获得的。任何人无法修改它,因为任何人都不能假冒 CA 但却可以验证数字证书是否正确。数字证书是可以公开的。数字证书在分发过程中没有被篡改的问题。这一点,在讨论 PKI 的安全时必须清楚。正是由于数字证书的不可修改,才使得 PKI 的管理和维护变得简单可行。
通过其组成我们从另一个侧面理解 PKI 。电力系统包括各种发电厂,连接电缆,并网控制设备,变电站,用电接口(如插座)等, PKI 包括 CA (证书机构), RA (登记机构),资料库,客户接口等。 CA 是签发证书的场所, RA 是登记的场所,资料库是管理证书的地方,客户接口是提供服务的标准接口。
系统结构也能表达一个基础设施的特征。一个发电机加两根电线可能不是电力基础结构,甚至连电力基础结构中的部件都不是。同样,一个 CA 和几个用户也不能算是 PKI 。一个不满足一定规范的 CA 可能都不能称为 PKI 的部件。 PKI 的部件的重要特点就是能够互操作。而互操作规范就是一种评判一个设备是否为 PKI 部件的一个标准。 PKI 应该是由多个可以互操作的 CA 、 RA 、资料库和众多接口组成的大的系统。
PKI 是目前唯一的能够基本全面解决安全问题的可能的方案。 PKI 通过电子证书以及管理这些电子证书的一整套设施,维持网络世界的秩序;通过提供一系列的安全服务,为网络电子商务、电子政务提供有力的安全保障。各国政府和许多民间机构都在纷纷研究和开发 PKI 产品,以望走在信息安全的前列。 PKI 同时是一个安全产品,可以成为对网络社会进行管理和维护的重要手段。谁拥有这项技术,谁就可能拥有对整个网络的控制权。 PKI 中最重要的设备就是 CA 。 CA 不仅是发放证书的机构,同时它也可以拥有密钥恢复能力。
控制 CA 和 CA 技术就非常关键。从国家安全的角度来说,“统一领导、集中管理、定点研制、专控经营、满足使用”就非常有意义。我们必须拥有自己的 CA 极其外围软件的自主的知识产权,拥有自己的,别人无法替代的位置。
为保证用户之间在网上传递信息的安全性、真实性、可靠性、完整性和不可抵赖性,不仅需要对用户的身份真实性进行验证,也需要有一个具有权威性、公正性、唯一性的机构,负责向电子商务的各个主体颁发并管理符合国内、国际安全电子交易协议标准的电子商务安全证书 , CA 体系应酝而生。
CA 机构,又称为证书授证 (Certificate Authority) 中心,是一个负责发放和管理数字证书的权威机构 , 它作为电子商务交易中受信任的第三方,承担公钥体系中公钥的合法性检验的责任。 CA 中心为每个使用公开密钥的用户发放一个数字证书,以实现公钥的分发并证明其合法性。数字证书是一个经证书授权中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件 , 作用是证明证书中列出的用户合法拥有证书中列出的公开密钥。 CA 机构的数字签名使得攻击者不能伪造和篡改证书。在 SET 交易中, CA 不仅对持卡人、商户发放证书,还要对获款的银行、网关发放证书。它负责产生、分配并管理所有参与网上交易的个体所需的数字证书,因此是安全电子交易的核心环节。
电子商务 CA 体系包括两大部分,即符合 SET 标准的 SET CA 认证体系和其他基于 X.509 的 CA 认证体系。
对于一个大型的应用环境,认证中心往往采用一种多层次的分级结构,各级的认证中心类似于各级行政机关,上级认证中心负责签发和管理下级认证中心的证书,最下一级的认证中心直接面向最终用户。
认证中心主要有以下五种功能:
• 证书的颁发
中心接收、验证用户 ( 包括下级认证中心和最终用户 ) 的数字证书的申请,将申请的内容进行备案,并根据申请的内容确定是否受理该数字证书申请。如果中心接受该数字证书申请,则进一步确定给用户颁发何种类型的证书。新证书用认证中心的私钥签名以后,发送到目录服务器供用户下载和查询。为了保证消息的完整性,返回给用户的所有应答信息都要使用认证中心的签名。
• 证书的更新
认证中心可以定期更新所有用户的证书,或者根据用户的请求来更新用户的证书。
• 证书的查询
证书的查询可以分为两类,其一是证书申请的查询,认证中心根据用户的查询请求返回当前用户证书申请的处理过程;其二是用户证书的查询,这类查询由目录服务器来完成,目录服务器根据用户的请求返回适当的证书。
(4) 证书的作废
当用户的私钥由于泄密等原因造成用户证书需要申请作废时,用户需要向认证中心提出证书作废的请求,认证中心根据用户的请求确定是否将该证书作废。另外一种证书作废的情况是证书已经过了有效期,认证中心自动将该证书作废。认证中心通过维护证书作废列表 (Certificate Revocation List,CRL) 来完成上述功能。
• 证书的归档
证书具有一定的有效期,证书过了有效期之后就将作废,但是我们不能将作废的证书简单地丢弃,因为有时我们可能需要验证以前的某个交易过程中产生的数字签名,这时我们就需要查询作废的证书。基于此类考虑,认证中心还应当具备管理作废证书和作废私钥的功能。总的说来,基于认证中心的安全方案应该很好地解决网上用户身份认证和信息安全传输问题。
相关推荐
Java安全编程指南是一本专为Java开发者设计的重要教材,它深入探讨了在开发过程中如何确保代码的安全性。这本书涵盖了各种关键主题,旨在帮助程序员避免常见的安全漏洞,保护系统免受恶意攻击,并创建可靠的软件产品...
Java安全编程指南旨在帮助开发者在使用Java编程时遵循最佳的安全实践,以保护应用程序免受潜在威胁。Java作为一种跨平台的编程语言,其安全性是其核心特性之一,但如果不正确地编写代码,可能会引入安全隐患。本指南...
以下是一些核心的Java安全编程原则和知识点: 1. 类加载器与访问控制:理解Java的类加载机制对于安全至关重要。类加载器负责加载类到JVM中,并通过权限检查防止未经授权的类访问敏感资源。 2. 访问修饰符:合理...
【标题】:“#资源分享达人# 代码审计[java安全编程].doc.zip”指出这是一个关于Java安全编程的代码审计主题的资源,其中包含了对Java代码进行安全性审查的实践指南或教程。这个压缩包可能包含了一份详细的文档,...
Java安全编程是一个重要的主题,尤其是在当今网络安全威胁日益严重的背景下。Marc_Schoenefeld在2005年的演讲中深入探讨了这一领域,为Java开发者提供了宝贵的指导。这本书不仅揭示了Java编程中的潜在安全问题,还...
本指南旨在提供全面的Java安全编程实践和策略,帮助开发者构建更安全的Java应用程序。 Java安全性涵盖多个层面,包括代码安全、访问控制、数据加密、网络安全以及恶意代码防范等。以下是一些核心的知识点: 1. **...
学习这些实例对于理解和掌握Java安全编程至关重要。 总的来说,Java安全性编程和HTTPS是构建安全网络应用的基础,涉及到加密技术、身份验证和数据完整性等多个方面。通过对这些概念和实践的学习,开发者能够有效地...
综上所述,"Java安全性编程实例"涵盖了Java安全的基础知识和实践技巧,尤其在多线程安全方面提供了丰富的示例,对于学习和提升Java安全编程能力具有很高的参考价值。通过深入研究这些实例,开发者可以更好地理解和...
Java安全性编程指南(PDG)是一本专注于帮助开发者理解和实践Java平台安全性的专业书籍。...通过深入学习和实践这些知识点,开发者可以更好地应对Java安全编程中的挑战,创建出更可靠、更安全的应用程序。
总的来说,这份“Java安全性编程指南源代码”资源涵盖了Java安全编程的核心概念和技术,对于学习和实践Java安全编程有着极大的帮助。通过深入研究源代码,开发者可以更好地理解和应用这些安全机制,提高应用程序的...
在Java平台上,安全编程是一个关键的实践领域,因为它提供了丰富的API和机制来确保应用程序的安全性。 首先,Java的安全模型是基于类加载器和安全策略的。每个Java应用程序都运行在一个称为“安全上下文”的环境中...
java安全性编程指南。。。。。。。。。。
Java安全性编程实例1
华为java安全编码规范考试3.1 血与泪整理除的答案,当前时间保证是最新的,基本所有题都能找到。有几题答案没写出来,但是写了所有的错误答案…………排除法
Java的安全开发技术规范以及安全开发注意要点
文件"Java安全性编程实例.doc"很可能是包含具体代码示例和详细解释的学习材料,它将帮助初学者将理论知识与实际操作相结合,通过实例深入理解和应用Java安全编程技巧。在阅读和学习这份文档时,务必动手实践,通过...
包括Socket编程、TCP/IP协议、Java Socket类、ServerSocket类、Java网络编程模型、网络编程常见问题、多线程编程、并发编程、Socket选项、网络安全、数据传输、网络协议、Socket超时、网络异常处理等。
理解类加载器的工作原理和如何利用它来增强安全性是高级Java安全编程的一部分。 8. 访问控制:Java的访问修饰符(public, private, protected, package-private)是控制代码访问性的重要工具。合理使用它们可以限制...
《Java安全性编程指南》是一本深入探讨如何在Java平台上实现安全编程的重要著作。该书针对的是那些希望构建安全、可靠的Java应用程序的开发者。在Java语言中,安全性是至关重要的,因为它的跨平台特性使得它成为了...
<Java安全性编程实例>书和代码,内容涉及Java加密和解密,反编译和反反编译,对类、成员变量、方法的攻击和保护,消息摘要,消息验证码,数字签名,口令保护,数字证书和证书链的生成、签发、检验和维护,SSL和HTTPS...