这一节以实践为主在跟着我做相应的操作之前我希望你已经能够理解笔记七所提到的概念至少你应该对于笔记七的那个大图有所了解 好了!对于习惯用ecplise的朋友今天不得不逼迫你把jdk的环境搭建出来!下面让我们动手来实践一下对jar进行签名吧! 第一步首先配置jdk的环境变量如果你的电脑已经配置了那直接跳过这一步 path=%JAVA_HOME%/bin JAVA_HOME=C:/Java/jdk_ CLASSPATH=;%JAVA_HOME%/lib/dtjar;%JAVA_HOME%/lib/toolsjar 配置要这几个jdk的环境参数好了配完了试着在cmd里跑一下javajavac看看命令是否生效如果配置成功执行第二步 第二步来写几个简单的类简单的才是大家的你完全可以直接copy我的代码部分看不懂忽略它做实验而已对那个jar文件签名不是签这个例子的代码逻辑是后面才用到的不用读 第一个类Doer package comyfqtest; public abstract interface Doer { void doYourThing() } 第二个类 package comyfqtestfriend; import javasecurityAccessController; import javasecurityPrivilegedAction; import comyfqtestDoer; public class Friend implements Doer{ private Doer next; private boolean direct; public Friend(Doer nextboolean direct){ thisnext=next; thisdirect=direct; } @Override public void doYourThing() { Systemoutprintln(Im a Friend) if (direct) { nextdoYourThing() } else { AccessControllerdoPrivileged(new PrivilegedAction() { @Override public Object run() { nextdoYourThing() return null; } }) } } } 第三个类 package comyfqteststranger; import javasecurityAccessController; import javasecurityPrivilegedAction; import comyfqtestDoer; public class Stranger implements Doer { private Doer next; private boolean direct; public Stranger(Doer next boolean direct) { thisnext = next; thisdirect = direct; } @Override public void doYourThing() { Systemoutprintln(Im a Stranger) if (direct) { nextdoYourThing() } else { AccessControllerdoPrivileged(new PrivilegedAction() { @Override public Object run() { nextdoYourThing() return null; } }) } } } 好了编译一下用强大的ecplise来编译项目右键Build Project(工具是拿来用的不要浪费这些强大的功能!) 第三步打jar包用ecplise就可以了就有导出jar包的功能我还是那句老话有工具不用不是牛是蠢 步骤一项目右键ExportjavaJAR filenext 步骤二展开目录清单分别对comyfqtesfriend和comyfqteststranger打包(friendjarstrangerjar)放到哪里就随便你了只要你记得就好我这里假设是放在d盘的根目录下 第四步用java的keytool生成密钥对用java的jarsigner做签名(记得笔记七我们说过对hash摘要的加密是非对称加密的吗?这里就需要两把不同的钥匙啦)一步步跟我来 步骤一cmd窗口进入到存放friendjar和strangerjar的目录下假设我的jar文件放在d盘下直接输入盘符d:就可以了 步骤二在cmd窗口中输入keytool genkey alias friend keypass friendlife validity keystore ijvmkeys 生成第一个密钥对这个密钥对的别名是 friend查看密钥对所需要的密码是friendfile密钥对的过期时间是天密钥对存储的文件名ijvmkeys 而查看ijvmkeys的密码我们设置为ijvmed 步骤三在cmd窗口输入keytool genkey alias stranger keypass strangerlife validity keystore ijvmkeys 按照步骤的截图一步一步输入吧这个步骤是生成别名为stranger的密钥对 好了密钥对生成结束看看你的jar文件目录下有没有多出一个文件ijvmkeys是滴这里生成了一个用于存放密钥对的文件 步骤四对jar进行摘要并对hash摘要进行加密生成签名放置到jar文件结构的尾部 在cmd窗口输入 jarsigner keystore ijvmkeys storepass ijvmed keypass firendfile friendjar friend jarsigner keystore ijvmkeys storepass ijvmed keypass strangerfile strangerjar stranger 步骤五查看生成的密钥文件在cmd窗口输入keytool list v keystore ijvmkeys storepass ijvmed 查看上面最后一个截图我们来验证一下在笔记七里说过的话 我们说过hash摘要是一个的值对不对呢看证书指纹那一行md:… 你数一数总共有几个十六进制数个一个十六进制数用个位可以表示完那么总共是几位*=但是后面还有一个sha的怎么回事他貌似不止位是滴散列函数多种多样到底用那个散列函数md还是sha这个就看你喜欢而要使用哪个散列函数是可以指定的keytool的参数keyalg DSA这个参数就是用来指定用什么散列算法的默认的就是DSA普通的位散列数已经是安全的了 在 笔记七中记不记得最下面那个图有一个认证机构会对解密签名(被加密的hash摘要)的公钥做认证(也就是加密公钥)并发布证书我们这里没有认证机构你有没有这个疑问? keytool程序在生成密钥时总是会生成一个自签名证书(自签名是指如果附近没有认证机构可以用私钥对公钥签名生成一个自签名证书) 总结 好了对于jar文件的签名我们已经完成了 |