Chinaunix首页 | 论坛 | 博客
  • 博客访问: 915209
  • 博文数量: 75
  • 博客积分: 6236
  • 博客等级: 准将
  • 技术积分: 726
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-03 14:43
文章分类

全部博文(75)

文章存档

2019年(1)

2018年(6)

2017年(4)

2015年(1)

2014年(9)

2013年(1)

2012年(3)

2011年(9)

2010年(3)

2009年(2)

2008年(4)

2007年(24)

2006年(8)

我的朋友

分类: Java

2007-04-03 16:08:53

这段时间对MIDP的安全架构比较关心,主要是保证MIDlet的安全,因此在网上找了很多的网络资源,分析之后,写了这篇记录稿,主要是记录了从MIDlet发布前的签名,到设备上的安装认证等步骤。

1 几个概念

1.RSA –非对称加密算法。这是目前MIDlet数字签名的普遍使用的算法,其内容主要包括一对密匙:
私匙(Private Key):用于数字签名的创建
公匙(Public Key):用于数字签名的验证

2.公钥证书(certificates):即数字证书。其主要内容包括该证书的签发者(Issuer),所有者(Owner),所有者的公匙(Public Key)等,一般符合X509标准;

3.如何自制证书
在$(WTK)/appdb/目录下执行下列命令即可:
(1)keytool -genkey -alias Hempel -keyalg RSA -dname "CN=Hempel Chen, O=Self, OU=Dev, C=CN" -validity 3650 -keypass MIDletSign -keystore mykeystore.sks -storepass MIDletSign
(2)keytool -selfcert -alias Hempel -keypass MIDletSign -keystore mykeystore.sks -storepass MIDletSign
(3)keytool -export -alias Hempel -file Hempel.cer -keystore mykeystore.sks -storepass MIDletSign
至于每个命令行是什么意思,大家看看参数名称应该也知道了,呵呵,网上也有很多的资料。

2 MIDlet签名过程

下面以JDK和WTK自带的签名工具的执行步骤来讲解MIDlet签名过程。以WTK的 apps/UIDemo为例:
1.jarsigner.exe -keystore mykeystore.sks -storepass MIDletSign $apps/UIDemo/bin/UIDemo.jar Hempel
使用keystore.sks中包含的/别名为Hempel的密匙对(由一个私匙和一个公匙组成一个密匙对)/中的私匙来对jar文件进行签名。其结果是在UIDemo.jar\META-INF 目录下多了 Hempel.SF和Hempel.RSA两个文件,并且原来的MAINFEST>MF文件也被更新;

2.java.exe -jar ../bin/JadTool.jar -addcert -alias Hempel -storepass MIDletSign -keystore mykeystore.sks -inputjad ../apps/UIDemo/bin/UIDemo.jad -outputjad UIDemo.jad
将数字证书的内容完成的拷贝到jad文件中去,作为MIDlet-Certificate-1-1这个域的值。(注意:如果是一个标准的商业证书,由于该证书可能是某些中间证书签发的,因此,这一步可能包含MIDlet-Certificate-1-2,MIDlet-Certificate-1-3等域)

3.java.exe -jar ../bin/JadTool.jar -addjarsig -jarfile ../apps/UIDemo/bin/UIDemo.jar -keypass MIDletSign -alias Hempel -storepass MIDletSign -keystore mykeystore.sks -inputjad UIDemo.jad -outputjad ../UIDemo.jad
采用SHA-1算法,对jar文件形成摘要(Digest),然后使用密匙对中的私匙(该私匙是与MIDlet-Certificate-1-1中的公匙对应)对jar文件的摘要进行加密(RSA加密),其计算结果作为MIDlet-Jar-RSA-SHA1这个域的值。
至此,签名完毕。

 

3 安装过程中的出处鉴定

如果MIDlet-Jar-RSA-SHA1属性出现,则JAR文件需要通过证书和签名,进行出处鉴定,这主要是防止有人假冒别人的名义来发布MIDlet。
安装时,设备可以通过其本身已经安装的CA根证书来验证MIDlet套件中的证书链,即jad文件中的属性MIDlet-Certificate--。如果能过通过MIDlet-Certificate-1-1-> MIDlet-Certificate-1-2-> MIDlet-Certificate-1-3->Root CA Certificate一层一层的验证,即表明此证书是值得信赖的,这是由CA(证书的Issuer)的信誉保证,从而表明该证书中声明的所有者(Owner)确实是这个人。因此也就表明该MIDlet的出处确实是该证书的所有者Owner
验证MIDlet-Certificate-1-1是由MIDlet-Certificate-1-2签发的,需要以下几个步骤:
(1) 检验 MIDlet-Certificate-1-1和MIDlet-Certificate-1-2 的时间有效性;
(2) 检验 MIDlet-Certificate-1-1 的 Issuer name(颁发者) 是否等于 MIDlet-Certificate-1-2 的 Subject name(主题)
(3) 使用MIDlet-Certificate-1-2 的公钥对 MIDlet-Certificate-1-1中的签名信息进行解密,得到摘要1;
(4) 采用MIDlet-Certificate-1-2 中的签名算法,对MIDlet-Certificate-1-1 的 Issuer name 进行SHA-1计算,等到摘要2;
(5) 比较摘要1和2是否一致,如果一致,则可信;否则,MIDlet-Certificate-1-1不是MIDlet-Certificate-1-2签发

 

4 安装过程中的完整性认证

验证完出处后,需要验证MIDlet的完成性,这主要是防止该MIDlet在发布过程中被有意或无疑的更改。
完整性认证步骤如下:
1.从MIDlet-Certificate-1-1证书中提取公匙;
2.使用该公匙对MIDlet-Jar-RSA-SHA1进行解密,得到jar文件的摘要1(jar的SHA-1属性);
3.采用SHA-1算法,由Java VM自己对jar文件重新进行计算,生成jar的摘要2(jar的SHA-1属性);
4.将摘要1和摘要2(第2步和第3步的输出)进行对比,如果一致则通过完整性认证;否则表示该MIDlet已经被更改;

关于如何获得证书,网上有很多的相关介绍,不过一般都是要money的。如果只是再自己的模拟器上测试,则可以自己制作证书并认证,呵呵,关于这方面,网上也是大把大把的资料

阅读(4203) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2009-07-16 13:56:21

好像应该是用公钥加密,私钥是自己保存的,不公开的,用来解密的。