android Jar文件的数字签名

2023-11-17

转自:http://hubingforever.blog.163.com/blog/static/17104057920118104058241/

JAR文件可以用 jarsigner工具或者直接通过 java.securityAPI 签名。签名后的JAR 本身的文件文件与原来JAR本身的 文件完全相同,只是更新了它的 manifest文件,并在 META-INF 目录中增加了两个文件,一个签名文件和一个签名块文件。
如果你对数字签名还不熟悉,请先阅读《数字签名简介》,《Java的数字签名和数字证书
JAR文件可以用一个存储在 Keystore数据库中的证书进行签名的。存储在 keystore 中的证书有密码保护,必须向 jarsigner工具提供这个密码才能对 JAR 文件签名。
图 1. Keystore 数据库
  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  -sigalg  MD5withRSA
这个命令序列用于生成一个名为的 公钥/私钥对 名字为 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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android Jar文件的数字签名 的相关文章

  • 应用程序签名机制

    原文链接 http www 2cto com Article 201308 237263 html Android安全机制分析 Android系统是基于Linux内核开发的 因此 Android系统不仅保留和继承了Linux操作系统的安全机
  • 使用fastboot工具刷入recovery.img、boot.img、system.img等

    下载解压 fastboot工具 解压FastBoot工具 zip 将解压得到的 FastBoot文件夹复制到任意盘如 D盘 将要刷入手机的recovery img recovery img等放到FastBoot文件夹 安装好手机型号对应的U
  • repo遍历所有git仓库

    repo遍历所有git仓库 repo forall c 命令 其中 参数有 c 后面可以带的任何可以被系统支持的shell命令 ls cp pwd等 p 在shell命令输出之前列出项目名称 v 列出执行shell指令输出的错误信息 该命令
  • Android系统源代码的下载与编译

    http www jianshu com p aeaceda41798
  • 移植linux开源软件到android系统

    例子 vlc android vlc android jni 目录 写连接vlc core 的jni 代码 vlc目录 configure host arm linux androideabi 生成linux Makefile 后面的编译和
  • Tensorflow的Bazel编程(二)

    转自 http blog csdn net langb2014 article details 54312697 安装官网 https bazel build versions master docs tutorial Java html
  • Android系统运动传感器

    转自 https blog csdn net liang123l article details 53992197 Android平台提供了多种感应器 让你监控设备的运动 传感器的架构因传感器类型而异 重力 线性加速度 旋转矢量 重要运动
  • Ubuntu虚拟机环境搭建Android系统源码编译环境及问题解决方法

    一 获取Android源码网络配置可以访问google 方法一 二 获取Android源码网络配置可以访问google 方法二 三 Ubuntu18 04下更改apt源为阿里云源 四 代理导致网络无法访问时 证书问题的解决方法 五 Ubun
  • 13 Binder通信之ServiceManager

    Binder通信之ServiceManager 一 前言 Android系统中存在很多service 当某个应用调用系统某个service的功能时 往往向系统发出请求 调用该服务的外部接口 这种外部接口我们通常叫做代理接口 也就是说要拿到目
  • android设备外接多个usb摄像头

    转自 https youshaohua com post android device external multiple USB camera 代码访问 OTG USB camera https github com quantum6 A
  • 导入android project到 eclipse 出现Unable to resolve target 'android-8'的错误

    今天导入一个Android的例子程序 出现了Unable to resolve target android 8 的错误 刚开始以为是没导入包或者是phoneGap没配置好 可是折腾了好久还是报错 最后google之后才发现原来是ADK版本
  • Android系统 —— 源码编译错误整理(持续更新)

    记录一些日常遇到的编译问题及解决方法 查找的时候可以直接搜索问题描述的关键部分 目录 1 更改源码目录名引发的错误 2 添加VNDK库 Vendor Native Development Kit 报错 3 头文件被重复包含 4 无法链接库文
  • 任意遥控器遥控C1测试成功,理论上可使用任意遥控

    转自 http bbs letv com thread 35538 1 1 html http bbs letv com thread 65155 1 1 html 任意遥控器遥控C1测试成功 理论上可使用任意遥控 现在测试了乐视随机九键遥
  • Android 开机加速优化

    文章目录 Android 开机加速优化 关闭BootLoader的企鹅 关闭开机动画Android 关闭锁屏 删除预装APP 查看预装APP 删除编译生成的APK 不编译APK 1 统一配置 2 修改单个APK的Android mk 谷歌A
  • android recovery 升级和分区

    1 华为手机分区信息 1 shell android df df Filesystem Size Used Free Blksize dev 196M 64K 196M 4096 mnt asec 196M 0K 196M 4096 mnt
  • Android Property System

    属性系统是android的一个重要特性 它作为一个服务运行 管理系统配置和状态 所有这些配置和状态都是属性 每个属性是一个键值对 key value pair 其类型都是字符串 从功能上看 属性与windows系统的注册表非常相似 许多an
  • 使用grep 过滤logcat输出

    转自 http www xmumu com post 2012 02 15 15478732 如何过滤 adb logcat 输出 简介 本文介绍如何在shell 命令行中过滤 adb logcat 输出的几个小技巧 开发当中经常看到别人的
  • Android 13 网络 Adb相关流程深入分析研究

    Android 13 网络 Adb 分析研究 文章目录 Android 13 网络 Adb 分析研究 一 前言 二 默认adb 代码实现 关键 1 修改的目录 2 具体修改 1 在XXX device mk 添加属性 2 设置固定端口号 3
  • build VCL on android

    转自 http wiki videolan org AndroidCompile AndroidCompile This page is an introduction to the compilation of VLC for Andro
  • Android下自定义的jar库文件编译和调用

    主要为了解决如下问题 项目中使用了Android未公开的API 在Eclipse下会有红叉显示 不同的项目抽出相同部分的代码共用 必需的前提条件 需要有Android源代码 编译的库文件主要是封装未公开API或者共用代码 工程1 Java库

随机推荐

  • k8s删除Terminating 的命名空间等资源

    背景 在k8s中执行删除命名空间后 命名空间没有被删除而是处于Terminating状态 此时再执行删除仍然删除不掉 解决 将要删除的命名空间信息导出为json数据 下面traefik v2 替换成你需要删除的命名空间名称 kubectl
  • 汇编 跳转指令: JMP、JCXZ、JECXZ、JA、JE、JNA、JNE、JZ、JB、JS、JC、JNC、JG、JNBE、JO、JP、JL、JPO、JGE、JLE 汇编语言

    以下为JCXZ和JECXZ JMP
  • TypeError: unsupported operand type(s) for &: ‘float‘ and ‘float‘解决方案

    今天在写Python代码的时候遇到了这么一个小问题 在网上查了也没有一个明确的解答 通过自己的摸索 终于找到问题的所在 真的是一个小问题就能难到很多人 希望能对你们有所帮助 主要还是运算符理解的不够透彻 对于那些学习了很多种编程语言的我们
  • 页面切换后,滚动栏问题

    项目场景 提示 react项目antd后台管理系统 问题描述 后台管理系统从a页面进入b页面 a页面有数据 有滚动条 且scollTop大于0 进入b页面后 滚动条不是位于初始位置 scollTop不等于0 b页面不是位于页面顶部 a页面
  • mysql 存储长文本

    在写项目时 需要把文章中的图文存储到mysql中数据库中 查了一下 gt 可以使用TEXT BLOB俩种类型来存储长文本 1 TEXT TEXT有4有类型 TINYTEXT 256bytes TEXT 64kb MEDIUMTEXT 16M
  • Spring常见面试题

    说说你对IOC的理解 相当于自己找女朋友和婚介公司帮忙找女朋友的过程 IOC可以重点理解以下几个部分 1 谁控制谁 在之前的编程过程中 都是需要什么对象就自己去创建什么对象 由程序员来控制对象 而有了IOC容器之后 就变成由IOC容器来控制
  • VS-Qt环境下dll

    首先 不得不承认的是 Qt中的数据类型使用很方便 当我们的主框架是基于Qt的时候也就没必要刻意追求辅助函数所在的dll是Win32的 如果原功能函数就是只使用标准库及基础类型 那也可以在Qt框架中调用 这不是本篇的重点 我们之所以要使用Qt
  • GetOpenFilename的基本用法

    GetOpenFilename 一 概述基本语法 Application GetOpenFilename 方法 显示标准的 打开 对话框 并获取用户文件名 而不必真正打开任何文件 只是把打开文件名称返回程序 GetOpenFilename相
  • httpClient 几种超时问题

    HttpClient的有3种超时时间 分别是 1 java view plaincopyprint ConnManagerParams setTimeout params 1000 ConnManagerParams setTimeout
  • [论文阅读] (21)S&P21 Survivalism: Systematic Analysis of Windows Malware Living-Off-The-Land (经典离地攻击)

    娜璋带你读论文 系列主要是督促自己阅读优秀论文及听取学术讲座 并分享给大家 希望您喜欢 由于作者的英文水平和学术能力不高 需要不断提升 所以还请大家批评指正 非常欢迎大家给我留言评论 学术路上期待与您前行 加油 前一篇从个人角度介绍USEN
  • python字典取值的几种方法

    Python 字典 dictionary 是一种可变容器模型 可以存储任意数量的任意类型的数据 字典中的每个元素由一个键和一个值组成 键和值之间用冒号分隔 字典通常用于存储键值对的数据 例如在数据库中存储记录 以下是 Python 字典取值
  • Unity将屏幕坐标转为世界坐标的思路

    1 使用ScreenToWorldPoint将获取的屏幕位置直接转成世界坐标 坑1 获取的屏幕坐标Input mousePosition是一个2d坐标 z轴值为0 这个z值是相对于当前camera的 为零表示z轴与相机重合了 因此给Scre
  • Floyd算法

    Floyd算法又称为插点法 是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法 与Dijkstra算法类似 该算法名称以创始人之一 1978年图灵奖获得者 斯坦福大学计算机科学系教授罗伯特 弗洛伊德命名 Dijkstra算法
  • Unsatisfied dependency expressed through field ‘userMapper‘问题解决

    SSM框架练手 mapper层 Autowire创建bean怎么也不成功 报错 org springframework beans factory UnsatisfiedDependencyException Error creating
  • JS 两个对象数组根据id去重 / 取补集

    let arr1 id 1 name a id 2 name b id 3 name c let arr2 id 1 name a let newArr arr1 filter item gt arr2 some val gt item1
  • 硬盘运行与“AHCI 模式”还是“IDE 模式” 分类: 生活百科 ...

    如今SATA硬盘越来越流行 最新购买或者组装的电脑 基本都安装新一代的SATA硬盘 由于绝大多数BIOS初始设置是 IDE模式 安装的windows XP和vista系统 并没有运行发挥最大性能的 AHCI模式 到底自己的系统是否运行与 A
  • SQL语句详解(四)——SQL联表查询

    今天我们继续给大家介绍MySQL相关知识 本文主要内容是SQL联表查询 一 SQL联表查询简介 在前文SQL语句详解 三 SQL子查询中 我们给大家介绍了SQL子查询的相关知识和使用示例 实际上 如果涉及到SQL多个表之间的查询 使用SQL
  • Java面向对象——图书管理系统(小白也能看的懂!)

    文章目录 一 功能介绍 二 JAVA面向对象思想 包的分装 1 book包 2 user包 较复杂 3 operation包 接口包 三 代码框架的搭建 1 book包 Book类 2 book包 BookList类 3 operation
  • 手机如何远程控制挂机宝? 影云挂机宝

    首先我们需要知道挂机宝是什么 挂机宝就相当于云电脑 24小时在线挂机 1 手机远程的话我们需要用到一个软件 微软远程桌面 远程桌面软件很多 这个随意 喜欢用哪个都行 安卓下载 https www lanzous com i2i8bti 密码
  • android Jar文件的数字签名

    转自 http hubingforever blog 163 com blog static 17104057920118104058241 JAR文件可以用 jarsigner工具或者直接通过 java securityAPI 签名 签名