标题：数字签名
基本介绍
数字签名，就是只有信息的发送者才能产生的别人无法伪造的一段数字串，这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。
数字签名是非对称密钥加密技术与数字摘要技术的应用。
数字签名了的文件的完整性是很容易验证的（不需要骑缝章，骑缝签名，也不需要笔迹专家），而且数字签名具有不可抵赖性（不需要笔迹专家来验证）。
简单地说,所谓数字签名就是附加在数据单元上的一些数据,或是对数据单元所作的密码变换。这种数据或变换允许数据单元的接收者用以确认数据单元的来源和数据单元的完整性并保护数据,防止被人(例如接收者)进行伪造。它是对电子形式的消息进行签名的一种方法,一个签名消息能在一个通信网络中传输。基于公钥密码体制和私钥密码体制都可以获得数字签名,主要是基于公钥密码体制的数字签名。包括普通数字签名和特殊数字签名。普通数字签名算法有RSA、ElGamal、Fiat-Shamir、Guillou- Quisquarter、Schnorr、Ong-Schnorr-Shamir数字签名算法、Des/DSA,椭圆曲线数字签名算法和有限自动机数字签名算法等。特殊数字签名有盲签名、代理签名、群签名、不可否认签名、公平盲签名、门限签名、具有消息恢复功能的签名等,它与具体应用环境密切相关。显然,数字签名的应用涉及到法律问题,美国联邦政府基于有限域上的离散对数问题制定了自己的数字签名标准(DSS)。
主要功能
保证信息传输的完整性、发送者的身份认证、防止交易中的抵赖发生。
数字签名技术是将摘要信息用发送者的私钥加密，与原文一起传送给接收者。接收者只有用发送者的公钥才能解密被加密的摘要信息，然后用HASH函数对收到的原文产生一个摘要信息，与解密的摘要信息对比。如果相同，则说明收到的信息是完整的，在传输过程中没有被修改，否则说明信息被修改过，因此数字签名能够验证信息的完整性。
数字签名是个加密的过程，数字签名验证是个解密的过程。
签名过程
“发送报文时，发送方用一个哈希函数从报文文本中生成报文摘要,然后用自己的私人密钥对这个摘要进行加密，这个加密后的摘要将作为报文的数字签名和报文一起发送给接收方，接收方首先用与发送方一样的哈希函数从接收到的原始报文中计算出报文摘要，接着再用发送方的公用密钥来对报文附加的数字签名进行解密，如果这两个摘要相同、那么接收方就能确认该数字签名是发送方的。
数字签名有两种功效：一是能确定消息确实是由发送方签名并发出来的，因为别人假冒不了发送方的签名。二是数字签名能确定消息的完整性。因为数字签名的特点是它代表了文件的特征，文件如果发生改变，数字签名的值也将发生变化。不同的文件将得到不同的数字签名。 一次数字签名涉及到一个哈希函数、发送者的公钥、发送者的私钥。”
数字签名：
发送方用自己的密钥对报文X进行Encrypt(编码)运算，生成不可读取的密文Esk，然后将Esx传送给接收方，接收方为了核实签名，用发送方的公用密钥进行Decrypt(解码)运算，还原报文。
个人邮件证书
具有数字签名功能的个人安全邮件证书是用户证书的一种，是指单位用户收发电子邮件时采用证书机制保证安全所必须具备的证书。个人安全电子邮件证书是符合x.509标准的数字安全证书，结合数字证书和S/MIME技术对普通电子邮件做加密和数字签名处理，确保电子邮件内容的安全性、机密性、发件人身份确认性和不可抵赖性。 具有数字签名功能的 个人安全邮件证书中包含证书持有人的电子邮件地址、证书持有人的公钥、颁发者(CA)以及颁发者对该证书的签名。个人安全邮件证书功能的实现决定于用户使用的邮件系统是否支持相应功能。 MS Outlook 、Outlook Express、Foxmail及CA安全电子邮件系统均支持相应功能。使用个人安全邮件证书可以收发加密和数字签名邮件，保证电子邮件传输中的机密性、完整性和不可否认性，确保电子邮件通信各方身份的真实性。
识别病毒
如何区分数字签名攻击呢？有两个方法：
1.查看数字签名的详细信息，我们应该查看该数字签名的详细信息，点击“详细信息”按钮即可。
我们会发现正常EXE和感染（或捆绑木马）后的EXE数字签名的区别。
正常EXE的数字签名详细信息。
被篡改后的EXE数字签名信息无效。
方法2，使用数字签名验证程序sigcheck.exe （可以百度一下找这个工具，著名系统工具包Sysinternals Suite的组件之一。）
数字签名异常的结果为：
C:\Documents and Settings\litiejun\??\modify.exe:
Verified: Unsigned
File date: 15:46 2008-5-23
Publisher: n/a
Description: n/a
Product: n/a
Version: n/a
File version: n/a
数字签名正常的结果为：
C:\Documents and Settings\litiejun\??\che.exe:
Verified: Signed
Signing date: 16:28 2008-4-29
Publisher: n/a
Description: n/a
Product: n/a
Version: n/a
File version: n/a
原因分析
1，精心设计的感染
当EXE被感染时，是很容易破坏文件的数字签名信息的，如果攻击者感染或破坏文件时，有意不去破坏EXE中有关数字签名的部分，就可能出现感染后，数字签名看上去正常的情况。但认真查看文件属性或校验文件的HASH值，你会发现该EXE程序已经不是最原始的版本了。
2.该软件发行商的数字签名文件被盗，攻击者可以把捆绑木马或感染病毒后的EXE程序，也打包上数字签名，这种情况下就更严重了。企业如果申请了数字签名证书，一定要妥善保管，否则后患无穷。
使用方法
你可以对你发出的每一封电子邮件进行数字签名。这不是指落款，普遍把落款讹误成签名。
在我国大陆，数字签名是具法律效力的，正在被普遍使用。2000年，中华人民共和国的新《合同法》首次确认了电子合同、电子签名的法律效力。2005年4月1日起，中华人民共和国首部《电子签名法》正式实施。
原理特点
每个人都有一对“钥匙”（数字身份），其中一个只有她/他本人知道（密钥），另一个公开的（公钥）。签名的时候用密钥，验证签名的时候用公钥。又因为任何人都可以落款声称她/他就是你，因此公钥必须向接受者信任的人（身份认证机构）来注册。注册后身份认证机构给你发一数字证书。对文件签名后，你把此数字证书连同文件及签名一起发给接受者，接受者向身份认证机构求证是否真地是用你的密钥签发的文件。
在通讯中使用数字签名一般基于以下原因：鉴权公钥加密系统允许任何人在发送信息时使用公钥进行加密，数字签名能够让信息接收者确认发送者的身份。当然，接收者不可能百分之百确信发送者的真实身份，而只能在密码系统未被破译的情况下才有理由确信。
鉴权的重要性在财务数据上表现得尤为突出。举个例子，假设一家银行将指令由它的分行传输到它的中央管理系统，指令的格式是(a,b)，其中a是账户的账号，而b是账户的现有金额。这时一位远程客户可以先存入100元，观察传输的结果，然后接二连三的发送格式为(a,b)的指令。这种方法被称作重放攻击。完整性传输数据的双方都总希望确认消息未在传输的过程中被修改。加密使得第三方想要读取数据十分困难，然而第三方仍然能采取可行的方法在传输的过程中修改数据。一个通俗的例子就是同形攻击：回想一下，还是上面的那家银行从它的分行向它的中央管理系统发送格式为(a,b)的指令，其中a是账号，而b是账户中的金额。一个远程客户可以先存100元，然后拦截传输结果，再传输(a,b3)，这样他就立刻变成百万富翁了。不可抵赖在密文背景下，抵赖这个词指的是不承认与消息有关的举动（即声称消息来自第三方）。消息的接收方可以通过数字签名来防止所有后续的抵赖行为，因为接收方可以出示签名给别人看来证明信息的来源。
如何实现
数字签名算法依靠公钥加密技术来实现的。在公钥加密技术里，每一个使用者有一对密钥：一把公钥和一把私钥。公钥可以自由发布，但私钥则秘密保存；还有一个要求就是要让通过公钥推算出私钥的做法不可能实现。
普通的数字签名算法包括三种算法：
1.密码生成算法 ；
2.标记算法 ；
3.验证算法 。
Java签名步骤
1、将applet的class文件打包成*.jar（不会的可以在命令行中输入jar查看帮助） 
2 首先我们要生成一个keystore 否则在签名的时候报如下错误
jarsigner 错误： java.lang.RuntimeException: 密钥库装入： C:\Documents and Settings\ij2ee\.keystore (系统找不到指定的文件。). (这边的ij2ee 是我当前系统用户名)
生成keystore的语句:keytool -genkey -alias 别名你可以自己写 -keyalg RSA -keystore .keystore
比如我的就是 keytool -genkey -alias ij2ee -keyalg RSA -keystore .keystore 
下面是会出现的数字签名的一些步骤操作:
输入keystore密码：
再次输入新密码:
您的名字与姓氏是什么？
[Unknown]： ij2ee
您的组织单位名称是什么？
[Unknown]： mtk
您的组织名称是什么？
[Unknown]： mtk
您所在的城市或区域名称是什么？
[Unknown]： suzhou
您所在的州或省份名称是什么？
[Unknown]： jiangsu
该单位的两字母国家代码是什么
[Unknown]： cn
CN=jeson, OU=mtk, O=mtk, L=suzhou, ST=jiangsu, C=cn 正确吗？
[否]： y
输入<sfcs>的主密码
（如果和 keystore 密码相同，按回车）：
这时候会在jdk的bin目录下生成 .keystore 。把这个.keystore文件移动到 C:\Documents and Settings\当前系统用户 的目录下面。
3、创建一个数字证书
在命令行中输入如下指令，peakCA和peakCALib自己起名字好了，3650是有效天数，就是10年左右，在创建证书的的时候，需要填写证书的一些信息和证书对应的私钥密码。这些信息包括 CN=xx,OU=xx,O=xx,L=xx,ST=xx,C=xx，都是中文，一看就懂的 
keytool -genkey -alias peakCA -keyalg RSA -keysize 1024 -keystore peakCALib -validity 3650 
4、将证书导出到证书文件中
在命令行中输入如下指令，peakCA和peakCALib自己起名字好了，******是你输入的密码 
keytool -export -alias peakCA -file peakCA.cer -keystore peakCALib -storepass ****** -rfc 
5、授权jar文件，在命令行中输入如下指令 
jarsigner -keystore peakCALib myapplet.jar peakCA 
应用例子
假如现在 Alice 向 Bob 传送数字信息，为了保证信息传送的保密性、真实性、完整性和不可否认性，需要对传送的信息进行数字加密和签名，其传送过程为：　　
1.Alice 准备好要传送的数字信息（明文）；
2.Alice 对数字信息进行哈希运算，得到一个信息摘要；
3.Alice 用自己的私钥对信息摘要进行加密得到 Alice 的数字签名，并将其附在数字信息上；
4.Alice 随机产生一个加密密钥，并用次密码对要发送的信息进行加密，形成密文；
5.Alice 用 Bob 的公钥对刚才随机产生的加密密钥进行加密，将加密后的 DES 密钥连同密文一起传送给Bob；
6.Bob 收到 Alice 传送来的密文和加密过的 DES 密钥，先用自己的私钥对加密的 DES 密钥进行解密，得到 DES 密钥；
7.Bob 然后用 DES 密钥对收到的密文进行解密，得到明文的数字信息，然后将 DES 密钥抛弃；
8.Bob 用 Alice 的公钥对 Alice 的数字签名进行解密，得到信息摘要；
9.Bob 用相同的哈希算法对收到的明文再进行一次哈希运算，得到一个新的信息摘要；
10.Bob 将收到的信息摘要和新产生的信息摘要进行比较，如果一致，说明收到的信息没有被修改过。