团队介绍
我们是光大科技有限公司安全管理团队,致力于提升光大集团信息安全防御能力,保障集团IT系统安全稳定运行,支撑集团业务发展;在集团“五统一”方针指引下,为集团成员企业提供定制化信息安全服务和安全产品,实现安全赋能;为金融科技行业提供有光大特色的信息安全解决方案及安全治理服务,提升光大科技品牌知名度。
我们拥有经验丰富的信息安全解决方案专家和技术专家,将持续与大家分享金融行业安全解决方案、企业信息安全架构和业界安全技术动态。期待与大家共同进步。
什么是数字签名
数字签名是一种类似写在纸张上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法。一套数字签名通常定义两种互补的运算,一种用于签名,另一种用于验签。以电子形式存在于数据信息之中,可用于辨别数据签署人的身份,并表明签署人对数据信息中包含的信息的认可。
数字签名是电子签名技术的一种,也是目前比较成熟且应用最为普遍的电子签名技术。电子签名和传统手写签名和盖章具有同等的法律效力。
数字签名技术原理
数字签名是指附加在数据报文上的一些数据,这些数据能够使数据报文的接收者确认数据单元的来源和数据的完整性,并保护数据,防止他人伪造。签名机制的本质特征是该签名只能通过签名者的私有信息(私钥)才能产生,也就是说,一个签名者的签名只能唯一的由他自己产生。下面是数字签名的签名和验签过程:
签名过程:
-
发送报文时,发送方用哈希函数从报文文本中生成报文摘要
-
然后用发送方的私钥对这个摘要进行加密
-
将加密后的摘要作为报文的数字签名和报文一起发送给接收方
验签过程:
-
接收方接收到报文后,首先用与发送方一样的HASH函数计算出原始报文的摘要
-
接着再用公钥对报文附加的数字签名进行解密得到发送方计算的摘要
-
然后对比这两个摘要,如果相同,那么接收方就能确认该报文是发送方的
数字签名是使用公钥加密体系来实现其安全性的,所以存在密钥的产生、验证、传通、保管及销毀等过程。采用公钥加密体系必须确定公钥持有者的真实身份。对信息接收者而言,它必须要确定用来解密的公钥是合法的发送者的公钥,才能确信信息不是冒名者截获修改过的。一般可以通过可信任的第三发机构来专门制造和发放证书,每个人在网络上的身份由他对应的数字证书来确定。用户自己产生密钥对,并通过CA(Certificate Authority)认证中心获取数字证书。数字证书是由计算机生成的,包含有CA验证过的该证书持有者的个人信息及对应的公钥。CA负责发放证书,并在每次通信过程中提供验证过程,但不涉及通信的具体内容。数字证书的主要操作是针对用户的公钥进行的,是用来证实公钥与公钥持有者真实身份之间的关系的。
数字签名简易实战
下面通过一段JAVA程序,演示一下数字签名的签名和验签过程。这个例子中用的加密算法是RSA算法,哈希算法是MD5:
public static void DigitalSignaByRSA() {
//需要签名的报文
String srcText = \"DigitalSignature\";
//篡改后的报文
String srcText2 = \"digitalSignature\";
try {
//1.初始化密钥
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(\"RSA\");
keyPairGenerator.initialize(512);
//生成密钥对
KeyPair keyPair = keyPairGenerator.generateKeyPair();
//生成公钥
RSAPublicKey rsaPublicKey = (RSAPublicKey)keyPair.getPublic();
//生成私钥
RSAPrivateKey rsaPrivateKey = (RSAPrivateKey)keyPair.getPrivate();
//2.执行签名
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());
KeyFactory keyFactory = KeyFactory.getInstance(\"RSA\");
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
//用MD5哈希算法和RSA非对称加密算法进行签名
Signature signature = Signature.getInstance(\"MD5withRSA\");
signature.initSign(privateKey);
signature.update(srcText.getBytes());
byte[] result = signature.sign();
System.out.println(\"数字签名:\" + Hex.encodeHexString(result));
//3.验证签名
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded());
keyFactory = KeyFactory.getInstance(\"RSA\");
PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
signature = Signature.getInstance(\"MD5withRSA\");
signature.initVerify(publicKey);
signature.update(srcText.getBytes());
boolean bool = signature.verify(result);
System.out.println(\"数字签名验签结果:\" + bool);
//4.验证签名-失败
signature = Signature.getInstance(\"MD5withRSA\");
signature.initVerify(publicKey);
signature.update(srcText2.getBytes());
boolean bool2 = signature.verify(result);
System.out.println(\"数字签名验签结果:\" + bool2);
} catch (Exception e) {
e.printStackTrace();
}
}
注:验签时需将srcText2改为篡改过的文本!
这段程序运行输出的结果如下图,可以看出当改变报文的内容时,在验签时接收人就可以知道原始的报文被篡改过:
数字签名的特点
在通讯中使用数字签名一般具有以下特点:
鉴权:
在公钥加密体系中,任何人在发送消息时可以使用私钥进行加密,接收消息时使用公钥解密。所以只要在密码系统未被破译的情况下,接收者可以确信发送者的真实身份。
完整性:
对于数字签名,签名和原文已经形成了一个混合的整体数据,通过公钥加密及HASH校验,使得数据不可能被篡改,从而保证了数据的完整性。
不可抵赖:
在密文背景下,抵赖这个词指的是不承认与消息有关的举动(即声称消息来自第三方)。消息的接收方可以通过数字签名来防止所有后续的抵赖行为,因为接收方可以出示签名给别人看来证明信息的来源。
总结
数字签名技术是实现网络中数据交换的核心技术之一,可以解决否认、伪造、篡改及冒充等问题。凡是需要对用户的身份进行判断的情况都可以使用数字签名,比如加密信件、商务信函、远程金融交易等,通过建立企业内部局域网中文件加密和数字签名系统,可以实现内部信息的安全传输,保证传输信息的完整性和不可否认性。
本文通过查阅相关资料及自己的理解写的一篇关于数字签名的介绍,如果存在不正确的地方,请大家指正。
往期推荐
1 |
制品库初识 |
2 |
初识对象存储 |
3 |
不防火的防火墙究竟在干些什么 |
4 |
数据库索引略知一二 |
欢迎关注EBCloud!
作者|于鹏文
原创文章,作者:EBCloud,如若转载,请注明出处:https://www.sudun.com/ask/33560.html