RSA数字签名是啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RSA数字签名是啥?相关的知识,希望对你有一定的参考价值。

在数字签名技术出现之前,曾经出现过一种“数字化签名”技术,简单地说就是在手写板上签名,然后将图像传输到电子文档中,这种“数字化签名”可以被剪切, 然后粘贴到任意文档上,这样非法复制变得非常容易,所以这种签名的方式是不安全的。数字签名技术与数字化签名技术是两种截然不同的安全技术,数字签名与用 户的姓名和手写签名形式毫无关系,它实际使用了信息发送者的私有密钥变换所需传输的信息。对于不同的文档信息,发送者的数字签名并不相同。没有私有密钥, 任何人都无法完成非法复制。从这个意义上来说,“数字签名”是通过一个单向函数对要传送的报文进行处理得到的,用以认证报文来源并核实报文是否发生变化的 一个字母数字串。JAVA异常机制指南

原理

该技术在具体工作时,首先发送方对信息施以数学变换,所得的信息与原信息惟一对应;在接收方进行逆变换,得到原始信息。只要数学变换方法优良,变换后的信息在传输中就具有很强的安全性,很难被破译、篡改。这一个过程称为加密,对应的反变换过程称为解密。
现在有两类不同的加密技术,一类是对称加密,双方具有共享的密钥,只有在双方都知道密钥的情况下才能使用,通常应用于孤立的环境之中,比如在使用自动取款 机(ATM)时,用户需要输入用户识别号码(PIN),银行确认这个号码后,双方在获得密码的基础上进行交易,如果用户数目过多,超过了可以管理的范围 时,这种机制并不可靠。
另一类是非对称加密,也称为公开密钥加密,密钥是由公开密钥和私有密钥组成的密钥对,用私有密钥进行加密,利用公开密钥可以进行解密,但是由于公开密钥无 法推算出私有密钥,所以公开的密钥并不会损害私有密钥的安全,公开密钥无须保密,可以公开传播,而私有密钥必须保密,丢失时需要报告鉴定中心及数据库。

算法

数字签名的算法很多, 应用最为广泛的三种是: Hash签名、DSS签名和RSA签名。
1. Hash签名
Hash签名不属于强计算密集型算法,应用较广泛。它可以降低服务器资源的消耗,减轻中央服务器的负荷。Hash的主要局限是接收方必须持有用户密钥的副本以检验签名, 因为双方都知道生成签名的密钥,较容易攻破,存在伪造签名的可能。
2. DSS和RSA签名
DSS和RSA采用了公钥算法,不存在Hash的局限性。RSA是最流行的一种加密标准,许多产品的内核中都有RSA的软件和类库。早在Web飞速发展之 前,RSA数据安全公司就负责数字签名软件与Macintosh操作系统的集成,在Apple的协作软件PowerTalk上还增加了签名拖放功能,用户 只要把需要加密的数据拖到相应的图标上,就完成了电子形式的数字签名。与DSS不同,RSA既可以用来加密数据,也可以用于身份认证。和Hash签名相 比,在公钥系统中,由于生成签名的密钥只存储于用户的计算机中,安全系数大一些。

功能

数字签名可以解决否认、伪造、篡改及冒充等问题。具体要求:发送者事后不能否认发送的报文签名、接收者能够核实发送者发送的报文签名、接收者不能伪造发送 者的报文签名、接收者不能对发送者的报文进行部分篡改、网络中的某一用户不能冒充另一用户作为发送者或接收者。数字签名的应用范围十分广泛,在保障电子数 据交换(EDI)的安全性上是一个突破性的进展,凡是需要对用户的身份进行判断的情况都可以使用数字签名,比如加密信件、商务信函、定货购买系统、远程金 融交易、自动模式处理等等。

缺憾

数字签名的引入过程中不可避免地会带来一些新问题,需要进一步加以解决,数字签名需要相关法律条文的支持。
1. 需要立法机构对数字签名技术有足够的重视,并且在立法上加快脚步,迅速制定有关法律,以充分实现数字签名具有的特殊鉴别作用,有力地推动电子商务以及其他网上事务的发展。
2. 如果发送方的信息已经进行了数字签名,那么接收方就一定要有数字签名软件,这就要求软件具有很高的普及性。
3. 假设某人发送信息后脱离了某个组织,被取消了原有数字签名的权限,以往发送的数字签名在鉴定时只能在取消确认列表中找到原有确认信息,这样就需要鉴定中心结合时间信息进行鉴定。
4. 基础设施(鉴定中心、在线存取数据库等)的费用,是采用公共资金还是在使用期内向用户收费?如果在使用期内收费,会不会影响到这项技术的全面推广?

实施

实现数字签名有很多方法,目前采用较多的是非对称加密技术和对称加密技术。虽然这两种技术实施步骤不尽相同,但大体的工作程序是一样的。 用户首先可以下载或者购买数字签名软件,然后安装在个人电脑上。在产生密钥对后,软件自动向外界传送公开密钥。由于公共密钥的存储需要,所以需要建立一个 鉴定中心(CA)完成个人信息及其密钥的确定工作。鉴定中心是一个政府参与管理的第三方成员,以便保证信息的安全和集中管理。用户在获取公开密钥时,首先 向鉴定中心请求数字确认,鉴定中心确认用户身份后,发出数字确认,同时鉴定中心向数据库发送确认信息。然后用户使用私有密钥对所传信息签名,保证信息的完 整性、真实性,也使发送方无法否认信息的发送,之后发向接收方;接收方接收到信息后,使用公开密钥确认数字签名,进入数据库检查用户确认信息的状况和可信 度;最后数据库向接收方返回用户确认状态信息。不过,在使用这种技术时,签名者必须注意保护好私有密钥,因为它是公开密钥体系安全的重要基础。如果密钥丢 失,应该立即报告鉴定中心取消认证,将其列入确认取消列表之中。其次,鉴定中心必须能够迅速确认用户的身份及其密钥的关系。一旦接收到用户请求,鉴定中心 要立即认证信息的安全性并返回信息。
参考技术A 数字签名集成的话可以去看看好签科技,原笔迹手写签字很不错。 参考技术B

假如A和B为了防止通信内容被篡改,通过RSA签名的处理一般过程是:

A先将待签名的内容(plainText)进行摘要运算,例如: md5,sha256,sha512之类的hash算法计算hash值(request_hash),然后对request_hash的值进行RSA私钥加密

    得到一个  encryptText值,  然后将原文plainText,encryptText值一起发给另外一端B

B事先得到了A的公钥配置,因此可以尝试解密encryptText,如果失败则说明公钥私钥有问题,如果成功了得到一个hash值,然后B自身也对原始内容plainText进行hash运算,得到一个local_hash值

和A发过来encrypt解密出来的request_hash值对比,如果一样则说明签名没问题是自己同志发过来的,否则中间有诈或者被篡改了。

如果需要调试验证结果,可以看下:RSA,ECC,Ecdsa,国密SM2的签名,加密

使用单独的密钥对进行签名和加密的目的是啥?

【中文标题】使用单独的密钥对进行签名和加密的目的是啥?【英文标题】:What is the purpose of using separate key pairs for signing and encryption?使用单独的密钥对进行签名和加密的目的是什么? 【发布时间】:2011-07-05 05:32:42 【问题描述】:

为什么我需要使用单独的公钥对进行签名和加密 例如,不使用与 RSA 相同的密钥对? 使用同一个密钥有安全问题吗?

【问题讨论】:

这个问题最好由Why should one not use the same asymmetric key for encryption as they do for signing? - Information Security Stack Exchange回答。 【参考方案1】:

使用单独的密钥进行签名和加密的原因:

    在组织中有用的是需要支持加密密钥或 保存在托管中,以便一旦员工/用户解密数据 组织不再可用。与加密密钥不同的是 签名密钥绝不能被其他任何人使用 员工/用户,不需要也不应该被托管。 允许对加密签名使用不同的到期时间 键。 鉴于基础数学对于加密和 如果攻击者可以说服/欺骗密钥,则仅反向签名 持有人使用相同的密钥签署未格式化的加密消息 然后攻击者得到原件。

【讨论】:

请注意,#3 是特定于 RSA 的。签名和加密的基础数学通常是不同的。不使用填充的 RSA 具有令人讨厌的特性,即签名预言机将解密消息,但良好的 RSA 签名和加密方案可确保操作不同(因此您不能使用 PSS 签名预言机解密 OEAP 加密的消息) . 您可能是正确的(来源?)。虽然我会留下答案,因为它仍然回答了 OP 的问题,因为他/她提到了 RSA 作为示例并且没有要求许多其他细节。【参考方案2】:

拥有单独的签名和加密密钥对允许公司备份加密证书,以便在您离开公司并且他们发现使用您的密钥加密的内容时解密数据。

通常,公司不会保留您的签名证书的备份副本,因为它会破坏有效数字签名的概念。如果签名证书由多方持有,那么谁真正用它签署了消息?

因此,加密密钥由用户持有并由公司备份。签名密钥仅由用户持有。

【讨论】:

@nKn 对我来说,这看起来像是一个答案,而不是一个问题。按照今天的标准,这个问题本身可能过于宽泛和基于意见,如果它是新的,就会被关闭,但鉴于这个问题,这是一个答案。【参考方案3】:

您可能想从安全堆栈中查看类似的问题:

https://security.stackexchange.com/questions/1806/why-should-one-not-use-the-same-asymmetric-key-for-encryption-as-they-do-for-sig

恕我直言,Am1rr3zA 的答案是最好的。

【讨论】:

【参考方案4】:

使用单独的密钥对进行签名和加密的原因是为了分散风险:如果有人恢复了私有加密密钥,他/她可以解密使用公共加密密钥加密但不能同时使用它的文档签署文件,反之亦然。

另一个原因可能是a legal reason:

在一些国家/地区,数字签名的状态有点类似于传统的纸笔签名,例如EU digital signature legislation。一般来说,这些规定意味着任何数字签名的东西都会合法地约束文档的签名者遵守其中的条款。因此,通常认为最好使用单独的密钥对进行加密和签名。使用加密密钥对,一个人可以进行加密对话(例如,关于房地产交易),但加密并不能合法地签署他发送的每条消息。只有当双方达成协议时,他们才会使用他们的签名密钥签署合同,然后他们才会受到特定文件条款的法律约束。签名后,文档可以通过加密链接发送。如果签名密钥丢失或泄露,可以撤销它以减轻任何未来的交易。如果加密密钥丢失,应使用备份或密钥托管来继续查看加密内容。永远不应备份或托管签名密钥。

【讨论】:

有两个签名密钥对是否合理,一个用于“我发送此消息”(这在合同谈判期间很有用),另一个用于“我想受此法律约束合同”? 不同意,其中一个签名声明我不希望受到法律约束。这是一个重要的区别。【参考方案5】:

阅读:http://en.wikipedia.org/wiki/Public-key_cryptography

基本上你是在问非对称加密和对称加密的区别。

【讨论】:

我理解这个问题是关于为什么使用不同的密钥对进行(非对称)加密和(也是非对称)签名。原则上,我的公共签名密钥也可以用于向我发送加密消息。 ... 那么拥有公钥和私钥是没有意义的。整个想法是有两个密钥,一个应该加密,一个应该解密。如果相同的密钥这样做,那么使用不对称编码是没有意义的。我想我还是没明白你想问什么。 (不是我在这里问的。)公钥加密的工作方式:cryptotext = crypt(message, public_key); message = crypt(cryptotext, private_key)。公钥签名:signature = crypt(message, private_key); message = crypt(signature, public_key)message 通常是文档的哈希)。前两个操作比后两个操作使用另一个密钥 pair 的原因在哪里?【参考方案6】:

我不完全确定你在说什么。我假设你想知道为什么你应该为 https/ssl/ssh 和代码签名使用不同的密钥(除了它们有不同的使用位)。

SSL 证书必须挂在网络服务器周围,这些服务器因被盗用而臭名昭著。代码签名证书可以完全离线隐藏。理论上。在实践中,Web 服务器由专业的系统管理员管理,代码签名证书被留在开发人员 PC 上。还有最小特权原则。

【讨论】:

以上是关于RSA数字签名是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Java数字签名算法--RSA

Go-数字签名详解与Rsa数字签名代码

RSA加密解密及RSA签名和验证

RSA 数字签名算法(Java版)

[转]RSA数字签名与数字信封

RSA加密解密及数字签名Java实现