当前位置:首页 » 编程博文
开发技术指南» 文章正文
    引言: 无标题文档 Java安全通信、数字证书及数字证书
 

 

 ·在.net1.2中对xquery的支持    »显示摘要«
    摘要:在.net1.2中支持xquery,xquery使用一种叫flwor的查询语言(音flower).例子如下: using system;using system.io;using system.xml;using system.xml.query;using system.data.sqlxml;namespace xquery{public class xquerysample{ public ......
    摘要:应该知道的: out是javax.servlet.jsp.jspwriter类的实例,jsp页面是对servlet进一步的封装。 问题: 假设jsp文件名为usingout.jsp, 其中有一个函数声明:void test(){ out.println("this is a test!"); // 编译出错!}%>void test(){? out.println("......


Java安全通信、数字证书及数字证书应用实践
上一页   ...

import java.io.*;

import javax.crypto.*; 【程序编程相关:VB.net基础:如何获得并显示网上图片

import java.security.*; 【推荐阅读:关于blog的作用的一些思考

public class mymac { 【扩展信息:JSP标签自定义(2)---getPro

import javax.crypto.spec.*;

public static void main(string[] args) throws exception{

//这是一个消息摘要串

string str="teststring";

//共同的密钥编码,这个可以通过其它算法计算出来

byte[] kb={11,105,-119,50,4,-105,16,38,-14,-111,21,-95,70,-15,76,-74,

67,-88,59,-71,55,-125,104,42};

//获取共同的密钥

secretkeyspec k = new secretkeyspec(kb,"hmacsha1");

//获取mac对象

mac m = mac.getinstance("hmacmd5");

m.init(k);

m.update(str.getbytes("utf-8"));

byte[] re = m.dofinal();//生成消息码

//下面把消息码转换为字符串

string result = "";

for(int i=0;i<re.length;i++){

result += integer.tohexstring((0x000000ff&re[i])|0xffffff00).substring(6);

}

system.out.println(result);

}

}

使用以上两种技术可以保证数据没有经过改变,但接收者还无法确定数据是否确实是某个人发来的.尽管消息码可以确定数据是某个有同样密钥的人发来的,但这要求双方具有共享的密钥,若有一组用户共享,我们就无法确定数据的来源了.

数字签名可以解决这一问题.数字签名利用非对称加密技术,发送者使用私钥加密数据产生的消息摘要(签名),接收者使用发送者的公钥解密消息摘要以验证签名是否是某个人的.由于私钥只有加密者才有,因此如果接收者用某个公钥解密了某个消息摘要,就可以确定这段消息摘要必然是对应的私钥持有者发来的.

使用数字签名的前提是接收数据者能够确信验证签名时(用发送者的私钥加密消息摘要)所用的公钥确实是某个人的 (因为有可能有人假告公钥).数字证书可以解决这个问题.

数字证书含有两部分数据:一部分是对应主体(单位或个人)的信息,另一部分是这个主体所对应的公钥.即数字证书保存了主体与它的公钥的一一对应关系.同样,数字证书也有可能被假造,如何判定数字证书的内容的真实性呢?所以,有效的数字证书必须经过权威 ca的签名,即权威ca验证数字证书的内容的真实性,然后再在数字证书上使用自己的私钥签名(相当于在证书加章确认).

这样,当用户收到这样的数字证书后,会用相应的权威 ca的公钥验证该证书的签名(因为权威的ca的公钥在操作系统中己经安装).根据非对称加密的原理,如果该证书不是权威ca签名的,将不能通过验证,即该证书是不可靠的.

若通过验证,即可证明此证书含的信息(发信人的公钥与信息)是无误的.于是可以信任该证书,便可以通过该证书内含的公钥来确认数据确实是发送者发来的.

于是,双方通信时, a把数据的消息摘要用自己的私钥加密(即签名),然后把自己的数字证书与数据及签名后的消息摘要一起发送给b,b处查看a的数字证书,如果a的数字证书是经过权威ca验证可靠的,便信任a,便可使用a的数字证书中附带的a的公钥解密消息摘要(这一过程同时确认了发送数据的人又可以解密消息摘要),然后通过解密后的消息摘要验证数据是否正确无误没被修改.

利用这一原理,我们可以突破 java的applet小程序在浏览器中的权限,由于默认的applet权限控制不允许它访问操作系统级的一切.于是我们可以用我们数字证书来给applet签名,然后客户端收到该applet时,系统会自动查看给该applet签名的数字证书并提供给终端用户判定是否信认该数字证书,如果用户信认,则该applet便有了访问系统的权限.

二. java中的数字证书的生成及维护方法

一.前言

java中的keytool.exe可以用来创建数字证书,所有的数字证书是以一条一条(采用别名区别)的形式存入证书库的中,证书库中的一条证书包含该条证书的私钥,公钥与对应的数字证书的信息.证书库中的一条证书可以导出数字证书文件,数字证书文件只包括主体信息与对应的公钥.

每一个证书库是一个文件组成,它有访问密码,在首次创建时,它会自动生成证书库,并要求指定访问证书库的密码.

在创建证书的的时候,需要填写证书的一些信息与证书对应的私钥密码.这些信息包括 cn=xx,ou=xx,o=xx,l=xx,st=xx,c=xx,它们的意思是:

cn(common name名字与姓氏)

ou(organization unit组织单位名称)

o(organization组织名称)

l(locality城市或区域名称)

st(state州或省份名称)

c(country国家名称)

可以采用交互式让工具提示输入以上信息,也可以采用参数

-dname "cn=xx,ou=xx,o=xx,l=xx,st=xx,c=xx"来自动创建.

二.示例

如下所示一句采用交互式创建一个证书,指定证书库为 abnercalib,创建别名为abnerca的一条证书,它指定用rsa算法生成,

且指定密钥长度为 1024,证书有效期为3650天:

c:\j2sdk1.4.1_01\mykeystore>keytool -genkey -alias abnerca -keyalg rsa -keysize 1024 -keystore abnercalib -validity 3650

如下图所示:


...   下一页
 ·mono 1.0 released    »显示摘要«
    摘要: novell and the mono project developer community is proud to announce the release of mono version 1.0, an open source implementation of the .net framework for use on linux, unix, macos x and windows s......
» 本期热门文章:

©2000-2007 All Rights Reserved. 最佳浏览:1024X768 MSIE