要对一段代码作担保或者签名,必须首先生成一个公钥/私钥对。用户应该保管那把私钥,而把公钥公开。一旦有了拥有了一个公钥/私钥对,就必须将要签名的class文件和其他文件放到了一个JAR文件中,然后使用一个工具对整个JAR文件签名。这个签名工具将首先对JAR文件的内容进行单项散列计算,以产生一个散列。然后这个工具将用私钥对这个散列进行签名,并且将经过签名后的散列加到JAR文件的末尾。这个签名后的散列代表了你对这个JAR文件内容的数字签名。当你发布这个包含签名散列的JAR文件时,那些持有你的公钥的人将对JAR文件验证两件事:这个JAR文件确实是你签名的,并且在你签名后这个JAR文件没有做过任何改动。散列也称消息摘要,它是通过单项散列算法产生的。
要认证一个已签名的JAR文件,接受者必须用公钥对签名散列进行解密,得到的结果应该和从JAR文件计算而得到的散列值相等。为了验证一个JAR文件在签名后未被动过,接受者只要对JAR文件的内容实施单项散列算法,就像在签名过程中所做的那样。(记住,并没有对JAR文件的内容进行加密,所以任何人都可以看见它。你只是将一个数字签名驾到了那个JAR我呢间中。)如果得到的散列值和加密的散列值匹配,那么接受者就可以推断,你确实为JAR文件进行了担保,而且这个JAR文件的内容在加上你的签名以后没有被改动过。这个JAR文件中包含的代码就可以放在一个不严格的沙箱中。
签名和认证如下图所示:
这种方式就像这样:你为某个公司介绍一个人,而那个公司不知道是好人还是坏人(就是说不知道是安全代码还是恶意代码),你怎么办呢?你就给那个公司寄了一个箱子,箱子里面装的是那个人的指纹(就是用私钥对散列值加密),而箱子是被一把锁(就是你的私钥)封闭了的,而这个人到了那个公司之后,那个公司首先用你给他的公钥(就是那个把锁的钥匙)解开那个箱子,然后取出箱子里的指纹(就是用公钥将签名值进行解密后的散列值),如果这个指纹跟那个人的指纹(就是原class文件的散列值)相符,那么这个公司就可以确定这个人是你推荐来的,你为这个人担保了的,所以这个人是个好人(意思就是安全的代码)!如果不相符,那么就拒绝这个人(恶意代码)!整个过程这个箱子是封闭了的,而且只有这个公司才能打开这个箱子查看指纹。但是这种方式不是绝对安全的,试想一下,我是一个黑客,我可以从三方面下手,第一,我的恶意代码产生和安全代码相同的散列值,这种方式不切实际,因为这就像破解密码一样。第二,盗取你的私钥,如果我得到你的私钥,那么我为自己恶意代码签名,就可以为所欲为,但是这种方法就像盗取别人的密码一样。第三,将别人的公钥替换成自己的公钥,这种方式很容易做到,如果某个人的公钥是从网上发布的,那么别人在下载这个公钥之前我把它替换成自己的公钥,这样的话,我再用自己的私钥为自己的恶意代码签名(私钥和公钥是成对的),那么下载公钥的人却误认为是解密后的散列值与原始class散列值相同(其实他只是用我的公钥解密我的私钥而已,所以我编写什么代码也可以蒙混过关),我就利用了用户对别人的信任来侵入他们的系统了。
所以从上面就可以看出,公钥发布成了一个问题,其实公钥发布的困难本身也是一个认证问题。试想一下,“我怎么确认这个代码是不是恶意代码”和“我怎么确认这个公钥是不是假公钥”属于同样的问题,基于这种思考,建立了许过证书机构来为这些公钥做担保。例如,你可以到一个证书机构去,给出你的信任证明(例如出生证明、驾驶证、护照等等)以及你的公钥。一旦确认你是真的如你自己所说的那个人,证书机构将会用证书机构的私钥对你的公钥进行前面,最终得到的数字序列被称为证书。这样,你就可以发布你的证书了,而不是你的公钥了。这种方式只是相对好了些,因为要替换公钥的话必须还要得到证书机构的私钥。
参考书籍:《Inside the Java Virtual Machine,Second Edition》
分享到:
相关推荐
大众V2版安全认证代码签名证书 (高级免费签名证书)含(KEY) 请访问以下网站下载最新版 http://ca130.ys168.com 提供最新有效期限 2011/07/10 - 2012/07/10 都是同一个颁发机构的旗下证书机构发行。。。机构名为:...
总结来说,"qq个性签名代码网站源码"是一个集前端交互、后端逻辑和数据库管理于一体的项目,涵盖了网页设计、编程语言、数据库技术和网络安全等多个IT领域的知识。通过这个源码,开发者不仅可以学习到网站开发的基本...
代码签名证书是软件开发过程中非常重要的一个环节,它主要用于验证软件的来源和完整性,确保代码在下载和安装时没有被篡改。这个"代码签名证书制作工具.zip"压缩包提供了一个方便的方式来创建自己的代码签名证书,这...
"仿淘宝签名认证 HMAC加密" 是一种常见的安全措施,用于确保数据在传输过程中的完整性,防止恶意篡改。本教程将深入讲解这种签名认证机制,以及如何在Java环境中实现。 HMAC(Hash-based Message Authentication ...
"去除签名认证"和"去除强制签名"这两个标签表明,这款工具专注于消除系统对驱动程序签名的要求,让安装过程更为便捷。尽管这样做可以安装更多未经认证的软件,但也带来了潜在的风险,因为未经签名的软件可能包含病毒...
代码签名是一种验证软件来源可靠性的方法,它通过数字签名技术为JAR文件提供了一种认证机制。在Java中,我们可以使用Java自带的工具如`jarsigner`来完成这个过程。代码签名的主要步骤包括生成密钥对(公钥和私钥)、...
信息安全大作业_CA系统的设计和实现源码(电子认证服务系统_数字证书数字签名python语言)+项目详细说明.7z CA代表Certificate Authority。也就是电子认证服务或机构,为电子签名相关各方提供真实性和可靠性验证,是...
总的来说,RSA2048签名是确保数据完整性和认证来源的有效手段,尤其在网络通信和软件更新等领域有着广泛的应用。这个C语言的实现是一个宝贵的教育资源,对于想要提升加密技术知识的开发者来说,是一个很好的实践平台...
在信息安全领域,数字签名是一种重要的技术,用于确保数据的完整性和发送者的身份验证。它结合了公钥密码学和哈希函数,为电子文档提供了一种类似于传统纸质文档上物理签名的功能。本练习主要涉及使用RSA算法进行...
1. 获取代码签名证书:向认证机构申请,提供必要的身份验证信息。 2. 导入或创建P12文件:将证书和私钥合并到P12文件中,便于管理和传输。 3. 使用代码签名工具:选择要签名的软件,使用P12文件进行签名操作。 4. ...
在Java2平台上实现身份认证和数字签名主要依赖于JCA和JCE提供的功能。身份认证通常涉及用户身份的验证,这可以通过公钥基础设施(PKI)中的数字证书来实现。数字签名则用于确保数据的完整性和来源的可信度,通过生成...
在面对多种通信威胁,如信息泄露、流量分析、伪造、内容和顺序修改、时间篡改以及否认等,消息认证和数字签名提供了一定程度的保护。认证系统可以分为几类: 1. **条件安全认证与无条件安全认证**:前者基于计算...
在IT行业中,Token认证签名加密是一种常见的安全机制,主要用于确保数据传输的安全性和验证请求的合法性。这个主题涉及了几个核心概念,包括Token、加密和签名,这些都是构建安全网络服务的关键要素。 1. **Token**...
在Android开发中,为了确保应用的...总的来说,理解和掌握如何在Android代码中获取签名MD5指纹是开发者保障应用安全的重要技能之一。通过实践这个demo,你可以更深入地了解Android签名机制,并提升应用的安全防护能力。
C#RSA加密解密签名和验证签名的小例子,代码都加了注释,可以很容易看懂.如果应用到消息收发,发送方用公钥加密,接收方用私钥解密.如果是应用到软件注册方面,则需要客户端保留公钥,程序开发者保留私钥.使用签名和验证...
然而,如果你需要进行WHQL(Windows Hardware Quality Labs)认证,以确保驱动在Windows系统中的兼容性和可靠性,那么就需要选择增强型(EV)代码签名证书。此外,对于Java应用程序、PDF文件等不同类型的签名,你...
MATLAB代码签名是指在MATLAB编写的代码中嵌入数字签名,以确保代码的完整性和来源。这对于分发和执行第三方MATLAB程序至关重要,因为它可以防止代码被恶意篡改,并让用户确认代码的来源。 在提供的压缩包文件" ECC...
8. **代码签名和认证**:Xcode负责处理iOS应用的签名和认证过程,确保应用的安全性和合规性。Xcode 12.3可能对此过程有更友好的引导或优化。 9. **Bug Reporter** 和 **Crash Logs**:对于开发者来说,诊断和修复...
在IT领域,数字签名是一种重要的安全技术,广泛应用于软件认证、文档签署以及网络通信中,以确保数据的完整性和来源的不可抵赖性。这里我们主要聚焦于在PDF文档中的数字签名实现,特别是通过iText库进行操作。iText...
描述中提到,PKI技术用于在线认证,这意味着它可能包含了用户身份验证的过程,例如证书申请、审批和分发。此外,描述还提到了数字证书的颁发,这是PKI的核心部分,用于建立公钥和私钥对,并将其绑定到实体身份上。...