分类: Java
2007-04-03 16:08:53
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
至于每个命令行是什么意思,大家看看参数名称应该也知道了,呵呵,网上也有很多的资料。
下面以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这个域的值。
至此,签名完毕。
如果MIDlet-Jar-RSA-SHA1属性出现,则JAR文件需要通过证书和签名,进行出处鉴定,这主要是防止有人假冒别人的名义来发布MIDlet。
安装时,设备可以通过其本身已经安装的CA根证书来验证MIDlet套件中的证书链,即jad文件中的属性MIDlet-Certificate-
验证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签发
验证完出处后,需要验证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的。如果只是再自己的模拟器上测试,则可以自己制作证书并认证,呵呵,关于这方面,网上也是大把大把的资料