Hello,my blog.好久不见.由于最近项目有些地方有涉及到数字签名,RSA加解密,数字证书等东西.虽然对其不太了解,也没有过多的影响到自己的开发,但是抱着一颗好奇的心,对其相关知识进行了网上冲浪,现在对自己所看到的相关资料,进行自我整理以及消化.在这一章,你将了解到[什么是数字签名] [什么是公钥私钥] [JAVA如何生成公钥私钥进行数字签名]
数字签名
数字签名何时诞生?
1976年,Whitfield Diffie 和 Martin Hellman 两人第一次提出了数字签名的概念,当时虽然他们并没有现成的方法去得到数据的数字签名,但是他们推测可以使用相关数学函数去进行计算获取 到数字签名,这个方案是可行的。随后不久, Ronald Rivest, Adi Shamir, 和 Len Adleman便研究出了RSA算法,这是一个可以生成数字签名的算法(虽然当时RSA算法得到的数字签名被公认为还是不安全的)最后第一个可以为指定数据生成数字签名的软件包诞生, Lotus Notes 在1989年将其发布。
数字签名是什么
简单来说,数字签名就是使用公认可靠的签名算法,使用公钥加密技术,生成一段数据的一串散列值。比如hello,zazalu这串数据的数字签名就类似于BE459576785039E8,我们可以将这一串值理解为非常难以破解的东西。
数字签名的用武之地在哪里
我用一个生活中的简单例子来做个比喻.
当我们收到自己爱人的来信时,激动不已的你急忙打开并且进行阅读。在这个简单的环节中,人的大脑其实自动帮你做了一个简单的验签的过程,你在看到那些熟悉的字体,熟悉的称呼或者一个简单的暗号后,你就为潜在的认为这封信确实是你的爱人写的,因为只有你熟悉他(她)的写法,只有你才知道暗号的含义。
数字签名其实起到的就和“暗号”“写法”这类东西类似,都是用来证明发件人确实是你爱人用的。在没有数字签名之前,我们在网上收到一封重要文件,虽然系统提示你发件人为A,但是并不代表真的是A,有可能是B正好偷偷用A的电脑发的也说不定。总而言之,在没有数字签名的时候,你无法确定发件人是谁。而数字签名就是起到证明发件人确实是A的作用的东西。
数字签名如何生成?
在前面,我有说到,数字签名是使用公认可靠的签名算法,使用公钥加密技术,为数据生成一串散列值。那么具体是怎么样的呢?
首先我们来简单说明下公钥加密技术,目前我们常用于数字签名的公钥加密技术有两种,一个是RSA,还有一个是DSA。不过在进行数字签名这方面,他们的行为在语言描述上是一致的,这里也就不做区分说明。
不管是RSA还是DSA算法,他们都需要两个密钥,一个叫公钥,一个叫私钥。使用加密算法前,我们需要先使用相关算法库,生成一对密钥对,使用公钥加密的信息只能由私钥进行解密
是的,由于公钥是公有的,谁都能获取,所以按逻辑上来说,我们不应该使用私钥进行加密。但是我们却可以利用这一点来验证这串数据是由谁加密的,因为私钥是保密的。我使用私钥生成一串数字签名,那么只要使用我的公钥解析数字签名并且使用相同算法比较数据的散列值,如果是一样的,就说明这个数据就确实是由我发出的,不会有假。这也就说明了数字签名的有效性,可靠性。
参考
上面几节,不知道讲没讲明白,但是我已经把我自己的理解全部整理了一遍,如果您还是不理解,不妨可以试试下面链接,都说明的不错
- https://security.stackexchange.com/questions/66392/why-should-i-sign-data-thats-already-encrypted
- https://docs.oracle.com/javase/tutorial/security/apisign/step3.html
- https://www.jianshu.com/p/090e35989501
JAVA如何生成数字签名
获取RSA密钥对的接口方法getRSAKeyPair
1 |
public KeyPair () throws NoSuchAlgorithmException{ |
使用我们刚刚生成的密钥对去生成指定文件的数字签名,getFileSignature接口参数,file为你指定的文件,keypair为你使用getRSAKeyPair生成的密钥对
1 |
public Signature getFileSignature(File file,KeyPair keyPair) throws NoSuchAlgorithmException, InvalidKeyException, IOException, SignatureException { |
把数字签名和公钥保存到本地
1 |
public void saveSignature(File signFile, Signature signature) throws IOException, SignatureException, NoSuchAlgorithmException, InvalidKeyException { |
将所有接口整合,运行起来的demo
1 |
|
小节
本章我们先从数字签名的基础知识讲起,随后用了实际代码例子进行了练习,现在我们应该都已经学会了使用java生成某个文件的数字签名!
在下一章中,我们将作为文件接收者,去验证这个数字签名是否正确,从而完成一整个使用数字签名验证发件人有效性的整个流程。
感谢作者






近期评论