代码签名的概念

转载自:https://www6.software.ibm.com/developerworks/cn/education/java/j-sec1/tutorial/j-sec1-8-5.html

 

代码签名的概念

JAR 文件在 Java 平台上相当于 ZIP 文件,允许将多个 Java 类文件打包到一个具有 .jar 扩展名的文件中。然后,可以对这个 JAR 文件进行数字签名,以证实其中的类文件代码的来源和完整性。该 JAR 文件的接收方可以根据发送方的签名决定是否信任该代码,并可以确信该内容在接收之前没有被篡改过。JDK 提供了带有这种功能的 jarsigner 工具。
      在部署中,可以通过在策略文件中放置访问控制语句根据签名者的身份分配对机器资源的访问权。

 

 

jarsigner 工具
jarsigner 工具将一个 JAR 文件、一个私钥和相应的证书作为输入,然后生成 JAR 文件的签名版本作为输出。它为 JAR 文件中的每个类计算消息摘要,然后对这些摘要进行签名以确保文件的完整性并标识文件的拥有者。
      在 applet 环境中,HTML 页面引用已签名 JAR 文件中包含的类文件。当浏览器接收这个 JAR 文件时,会对照任何安装的证书或认证中心的公用签名检查该 JAR 文件的签名以验证其有效性。如果未找到现有的证书,则会向用户显示一个提示屏幕,给出证书详细信息并询问用户是否打算信任该代码。

 

 

 

代码签名示例
在本示例中,我们首先从 .class 文件创建 JAR 文件,然后通过在用于签名的密钥库中指定证书的别名来对 JAR 文件签名。然后,我们对已签名的 JAR 文件运行验证检查。

D:\IBM>jar cvf HelloWorld.jar HelloWorld.class
added manifest
adding: HelloWorld.class(in = 372) (out= 269)(deflated 27%)

D:\IBM>jarsigner HelloWorld.jar JoeUserKey
Enter Passphrase for keystore: password

D:\IBM>jarsigner -verify -verbose -certs HelloWorld.jar

         137 Mon Apr 15 12:38:38 CDT 2002 META-INF/MANIFEST.MF
         190 Mon Apr 15 12:38:38 CDT 2002 META-INF/JOEUSERK.SF
         938 Mon Apr 15 12:38:38 CDT 2002 META-INF/JOEUSERK.RSA
           0 Mon Apr 15 12:38:00 CDT 2002 META-INF/
smk      372 Mon Apr 15 12:33:02 CDT 2002 HelloWorld.class

      X.509, CN=Joe User, OU=Security, O="Company, Inc.", L=User City,
      ST=MN, C=US (joeuserkey)


  s = signature was verified
  m = entry is listed in manifest
  k = at least one certificate was found in keystore
  i = at least one certificate was found in identity scope

jar verified.

 

 

 

代码签名示例执行
下面是用于该程序的 HTML:

<HTML>
<HEAD>
<TITLE> Hello World Program </TITLE>
</HEAD>
<BODY>
<APPLET CODE="HelloWorld.class" ARCHIVE="HelloWorld.jar"
  WIDTH=150 HEIGHT=25>
</APPLET>
</BODY>
</HTML>

当在将 Java 插件用作 Java 虚拟机的浏览器中执行这个示例时,会弹出一个对话框询问用户是否希望安装和运行由“Joe User”分发的已签名的 applet,并告知用户发布者的可靠性是由“Company,Inc.”验证的,但安全性结论是由一家未获信任的公司发出的。该安全性证书还未过期并仍然有效。它警告:“Joe User”断言该内容是安全的,仅当您相信“Joe User”所作的断言时才应该安装或查看其内容。向用户提供了下列选项:

    * 准许这个会话
    * 拒绝
    * 始终准许
    * 查看证书

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SM2(Secure Multiparty Computation 2)是一种国制定的非对称密码算法,用于数字签名和密钥交换等场景。虽然不是OpenAI或ChatGPT直接支持的算法,但C语言实现SM2签名的基本步骤包括生成密钥对、签名以及验证签名。以下是一个简化的C语言示例,展示了SM2签名的基本概念: ```c #include <stdint.h> #include <stdlib.h> // SM2密钥结构体 typedef struct { uint8_t publicKey[64]; // 公钥 uint8_t privateKey[64]; // 私钥 } SM2KeyPair; // 假设有一个SM2KeyPair类型的变量keyPair SM2KeyPair keyPair; // SM2签名函数,使用keyPair私钥 uint8_t* sm2_sign(const uint8_t* msg, size_t msg_len, uint8_t* signature, size_t* sig_len) { // 实际实现可能涉及更复杂的数学运算和库调用 // 这里仅提供基本框架 if (!signature || !msg || !msg_len || !sig_len) return NULL; // 使用密钥和消息计算签名 // 使用密钥派生函数和哈希函数,例如SHA-256 // ... *sig_len = ...; // 计算签名长度 return signature; } // SM2验证签名函数 bool sm2_verify(const uint8_t* msg, size_t msg_len, const uint8_t* signature, size_t sig_len, const uint8_t* pubkey) { // 解码签名,然后用公钥和消息计算哈希值 // 如果哈希值和解码后的签名一致,则返回true,否则返回false // ... return ...; } // 示例用法 int main() { // 初始化密钥对 if (!init_sm2_key_pair(&keyPair)) return 1; // 签名 uint8_t signature[256]; size_t sig_len; if (sm2_sign("Hello, World!", sizeof("Hello, World!"), signature, &sig_len) == NULL) return 1; // 验证签名 if (!sm2_verify("Hello, World!", sizeof("Hello, World!"), signature, sig_len, keyPair.publicKey)) { printf("Signature verification failed.\n"); return 1; } return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值