加密算法分为两大类:1.对称加密算法;2.非对称加密算法。javascript
密钥个数 | 加密 | 解密 | |
---|---|---|---|
对称加密 | 一个 | 使用密钥加密 | 使用同一个密钥解密 |
非对称加密 | 两个,公钥和私钥 | 使用其中一把密钥加密 | 使用另一把密钥解密 |
RSA是一个可以同时用于加密和数字签名的算法,典型的应用场景:隐藏原文、防止原文被篡改、身份认证。隐藏原文是全部加密算法的通用功能(要否则怎么叫加密),防止原文被篡改是数字签名的功能,数据传输的具体流程以下:java
RSA对一次加密的明文的长度是有要求的,在不一样的padding模式下,能加密的明文长度也不相同。以RSA 1024为例,输入的明文的字节数不能超过钥模长1024bits,即最长为128bytes。RSA 1024的不一样padding模式下的明文长度的最大值计算公式:linux
数字签名是一份数据通过特定的算法计算后得出的特殊标识,用来防止数据在传输过程当中被伪造或篡改,是非对称加密技术与数字摘要技术的综合应用。算法
数字摘要算法具备如下重要特性:后端
非对称加密技术可以确保只有持有密钥对的双方才能获取到正确的数据,但对加密原文的长度有限制,而数字摘要算法可以将输入数据转换为固定长度的摘要,并保证在原数据不变的状况下,摘要计算结果是一致的。这两项技术的特性的结合,就造成了数字签名的经典应用场景:安全
RSA和数字签名在Https协议通讯中有经典的应用,这里再也不赘述。ruby
在开放平台中,RSA和数字签名多用于开发者接入的身份验证。app
独立开发者接入平台时,使用RSA算法做为开发者身份验证的核心算法,如云信通IM平台即便用此种模式。开发者接入平台时,须要以下几个步骤:ssh
SHA1哈希算法生成数字签名也被应用于独立开发者接入模式,如融云开放平台、网易云信就使用此模式。开发者接入平台时,须要以下几个步骤:工具
在全部平台服务端 API 接口的请求中,都须要附带如下4个HTTP Request Header:
| 名称| 类型 | 说明 | | AppKey | String | 平台分配的 App Key | | Nonce| String | 随机数,长度无限制 | | Timestamp | String | 时间戳 | | Signature | String | 数字签名 |
这种开发者接入模式中,数字签名起到几个做用:
SHA1没有明文长度的限制,这也是其比RSA算法有优点的地方,但SHA1算法是摘要算法,其计算出来的结果是没法解密的。