Jar文件的数字签名

原创 2011年12月13日 13:20:28
JAR文件可以用 jarsigner工具或者直接通过 java.securityAPI 签名。签名后的JAR 本身的文件文件与原来JAR本身的 文件完全相同,只是更新了它的 manifest文件,并在 META-INF 目录中增加了两个文件,一个签名文件和一个签名块文件。
如果你对数字签名还不熟悉,请先阅读《数字签名简介》,《Java的数字签名和数字证书
JAR文件可以用一个存储在 Keystore数据库中的证书进行签名的。存储在 keystore 中的证书有密码保护,必须向 jarsigner工具提供这个密码才能对 JAR 文件签名。
图 1. Keystore 数据库
数字签名Jar文件 - hubingforever - 民主与科学
 Jar文件使用jarsigner签名以后,在META-INF文件夹下会多出两个文件:XXX.SF文件XXX.YYY文件。XXX应该与你签名时使用密钥的别名一致.而XXX.YYY的扩展名,根据数字签名的类型RSA、DSA 或者 PGP 以及用于签名 JAR 的证书类型而有不同的扩展名。XXX.SF文件的格式类似于 manifest 文件(一组 RFC-822 头)。XXX.SF文件主要包括的对JAR本身文件及Manifest文件的签名码(加密后的散列码)。奇怪的是进行签名后Manifest文件中也有针对JAR本身文件的签名码,且和XXX.SF文件中的不一样。为什么会有两个呢?不解。在XXX.YYY文件(比如TEST.RSA)中,除了签名私钥所对应的公钥外,还包含了签名者的一些信息。
在验证一个签名的 JAR 时,将签名文件的摘要值与对 JAR 文件中的相应项计算的摘要值进行比较。
MANIFEST.MF文件:
Manifest-Version: 1.0
Created-By: 1.6.0_11 (Sun Microsystems Inc.)
Main-Class: Hello

Name: Util.class
SHA1-Digest: UQkSPocH+hEH4W8d4/E7ifo7Y2A=

Name: Hello.class
SHA1-Digest: HQJfMvXm5JhrX2afxITiicvzDdQ=
TEST.SF文件
Signature-Version: 1.0
SHA1-Digest-Manifest-Main-Attributes: +yrcddwVI7QFdviahKRNKIHg2Zc=
Created-By: 1.6.0_11 (Sun Microsystems Inc.)
SHA1-Digest-Manifest: dCxOoUzPsGXrxxYH5PRNx47Er7M=

Name: Util.class
SHA1-Digest: 5g4n0t4ScMDowIF10vD7pMtcM1g=

Name: Hello.class
SHA1-Digest: OvGpI1SCZ7Py8O0rjqUUsZT6H/Q=
Keystore
要签名一个 JAR 文件,必须首先有一个私钥。私钥及其相关的公钥证书存储在名为keystores的、有密码保护的数据库中。JDK 包含创建和修改 keystores 的工具。keystore 中的每一个密钥都可以用一个别名标识,它通常是拥有这个密钥的签名者的名字。
所有 keystore 项 ( 密钥和信任的证书项 ) 都是用唯一别名访问的。别名是在用 keytool -genkey 命令生成密钥对 ( 公钥和私钥 ) 并在 keystore 中添加项时指定的。之后的 keytool命令必须使用同样的别名引用这一项。
例如,要生成一个别名为“robin”生成一个新的公钥 / 私钥对并将公钥包装到自签名的证书中,要使用下述命令:
例1
keytool -genkey -alias robin -keystore robin.keystore -storepass GL2009 -keypass gl2009 -validity 100 -keyalg RSA -keysize 1024 -sigalgMD5withRSA
这个命令序列用于生成一个名为的公钥/私钥对名字为robin,并把它添加到文件名为robin.keystore的keystore文件中,如果该文件还不存在,则创建它。其中文件名密码为GL2009,要添加的公钥/私钥对的私钥密码为gl2009,文件有效期为100天,公钥/私钥对名字为robin,公钥/私钥对采用RSA算法,公钥/私钥的长度为1024签名时采用MD5withRSA算法(用MD5算法进行散列,用RSA算法对其散列码进行加密)
然后按照提示输入一些信息,如下:
What is your first and last name?
  [Unknown]:  hubing
What is the name of your organizational unit?
  [Unknown]:  GL
What is the name of your organization?
  [Unknown]:  gameloft
What is the name of your City or Locality?
  [Unknown]:  chengdu
What is the name of your State or Province?
  [Unknown]:  shichuan
What is the two-letter country code for this unit?
  [Unknown]:  cn
Is CN=hubing, OU=GL, O=gameloft, L=chengdu, ST=shichuan, C=cn correct?
  [no]:  yes
jarsigner 工具
通过jarsigner工具,可以使用 keystore 生成或者验证 JAR 文件的数字签名。
假设像例1那样创建了keystore文件robin.keystore,可以用下面的命令签名一个 JAR 文件:
例2
jarsigner -keystore robin.keystore -storepass GL2009 -keypass gl2009 Hello.jar robin
这个命令用密码“GL2009”从名为“robin.keystore”的keystore文件中提出名字为“robin”、密码为“gl2009”的公钥/私钥对,并对Hello.jar 文件按照keystore文件robin.keystore中的约定进行数字签名。
例3
jarsigner -keystore robin.keystore -storepass GL2009 -keypass gl2009 -signedjar Hello_signed.jar Hello.jar robin
这个命令用密码“GL2009”从名为“robin.keystore”的keystore文件中提出名字为“robin”、密码为“gl2009”的公钥/私钥对,并对Hello.jar 文件按照keystore文件robin.keystore中的约定进行数字签名,签名的输出文件为Hello_signed.jar
jarsigner工具还可以验证一个签名的 JAR 文件,很简单,只需执行以下命令:
 jarsigner -verify Hello.jar 
如果签名的 JAR 文件没有被篡改过,那么 jarsigner工具就会告诉您 JAR 通过验证了。否则,它会抛出一个 SecurityException, 表明哪些文件没有通过验证。还可以用 java.util.jar和 java.securityAPI 以编程方式签名 JAR
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hudashi/article/details/7066526

如果给jar包制作数字签名

  • 2012年03月21日 14:47
  • 41KB
  • 下载

为jar包进行数字签名

生产商业系统的开发者会购买证书来签名他们的JAR,一般的开发者则可以用匿名证书来签名他们的JAR。 为JAR签名需要两个工具:你要用keytool来创建一个密匙,然后用JARSign...
  • pyshibin
  • pyshibin
  • 2013-05-19 20:05:23
  • 8441

Jar 文件数字签名

JAR 文件中的安全性JAR 文件可以用 jarsigner 工具或者直接通过 java.security API 签名。一个签名的 JAR 文件与原来的 JAR 文件完全相同,只是更新了它的 man...
  • hunterK
  • hunterK
  • 2006-09-06 21:38:00
  • 6580

jarsigner - JAR 签名和校验工具

jarsigner - JAR 签名和校验工具为 Java 归档 (JAR) 文件产生签名,并校验已签名的 JAR 文件的签名。结构jarsigner [ options ] jar-file ali...
  • yangxt
  • yangxt
  • 2007-09-23 14:48:00
  • 37191

Java中Jar文件及签名工具详解

附: 大多数 Java 程序员都熟悉对 JAR 文件的基本操作。但是只有少数程序员了解 JAR 文件格式的 强大功能。在本文中,作者探讨了JAR 格式的许多功能和优势,包括打包、可执行的 JAR 文件...
  • tanga842428
  • tanga842428
  • 2016-09-03 20:51:53
  • 689

<em>jar</em> 包自动<em>数字签名</em>工具

可以自动完成对<em>jar</em>包的<em>数字签名</em>如对挂在网页上的applet进行<em>数字签名</em>... 可以自动完成对<em>jar</em>包的<em>数字签名</em>如对挂在网页上的applet进行<em>数字签名</em> 综合评分:4(19位用户评分...
  • 2018年03月18日 00:00

Jar文件的数字签名

JAR文件可以用 jarsigner工具或者直接通过 java.securityAPI 签名。签名后的JAR 本身的文件文件与原来JAR本身的 文件完全相同,只是更新了它的 manifest文件,并在...
  • hudashi
  • hudashi
  • 2011-12-13 13:20:28
  • 3610

【转载】Jar文件的数字签名

JAR文件可以用 jarsigner工具或者直接通过 java.securityAPI 签名。签名后的JAR 本身的文件文件与原来JAR本身的 文件完全相同,只是更新了它的 manifest文件,并在...
  • dahailantian1
  • dahailantian1
  • 2017-11-20 17:35:56
  • 37

如何对jar包进行数字签名

为了使Applet或者Java Web Start程序能够访问客户端本地资源,需要对Applet或者JWS程序jar包进行数字签名,之后客户端打开Applet或者JWS程序的时候会提示是否允许该程序访...
  • lingqi1818
  • lingqi1818
  • 2014-06-16 09:43:08
  • 314

PDF时间戳数字签名 ,jar包配置

具体代码参考:PDF时间戳数字签名 - CSDN博客http://blog.csdn.net/running_snail_/article/details/52995983#replyjava包按如下...
  • xiaobijia
  • xiaobijia
  • 2018-01-18 14:41:39
  • 201
收藏助手
不良信息举报
您举报文章:Jar文件的数字签名
举报原因:
原因补充:

(最多只允许输入30个字)