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
如下图所示:
... 下一页