RSA/SHA1加密和数字签名算法在开放平台中的应用
加密算法
加密算法分为两大类:1.对称加密算法;2.非对称加密算法。
| 密钥个数 | 加密 | 解密 | |
|---|---|---|---|
| 对称加密 | 一个 | 使用密钥加密 | 使用同一个密钥解密 | 
| 非对称加密 | 两个,公钥和私钥 | 使用其中一把密钥加密 | 使用另外一把密钥解密 | 
RSA非对称加密算法
- RSA是目前应用最广泛的非对称加密算法,各种语言都支持RSA算法,如Java,Python,C++(openssl),Go(openssl),PHP(openssl),Object-C,Android,javascript等。
 - 对于一个私钥匙、有且只有一个与之对应的公钥。公/私钥的主流可选位长度为1024、2048、3072、4096....,越长安全系数越高。私钥加密的内容,使用公钥能够解密,同样使用公钥加密的内容,使用私钥也能解密。
 - 在linux系统下,有两种常用的工具用于生成RSA密钥对,ssh-keygen和openssl genrsa。
 RSA是一个能够同时用于加密和数字签名的算法,典型的应用场景:隐藏原文、防止原文被篡改、身份认证。隐藏原文是所有加密算法的通用功能(要不然怎么叫加密),防止原文被篡改是数字签名的功能,数据传输的具体流程如下:
- 甲方构建密钥对,将公钥交给乙方
 - 甲方使用私钥加密原文,然后将加密数据发送给乙方。乙方使用公钥对签名进行解密,获取原文,如果解密失败,则原文被篡改。
 - 乙方给甲方发送原文的时候,先使用公钥对原文加密,将加密数据发送给甲方。甲方使用私钥对签名解密,获取原文,如果解密失败,则原文被篡改。
 
- 如果第三方不知道密钥对,则第三方什么都做不了。如果第三方知道公钥,则第三方对甲方的原文具有与乙方一样的阅读权限,但无法篡改甲方的原文,因为没有私钥,无法生成合法的数字签名。
 RSA对一次加密的明文的长度是有要求的,在不同的padding模式下,能加密的明文长度也不相同。以RSA 1024为例,输入的明文的字节数不能超过钥模长1024bits,即最长为128bytes。RSA 1024的不同padding模式下的明文长度的最大值计算公式:
- RSA_PKCS1_PADDING RSA_size(1024) - 11 = 117bytes
 - RSA_PKCS1_OAEP_PADDING RSA_size(1024) - 41 = 87bytes
 - RSA_NO_PADDING RSA_size(1024) = 128bytes
 
- 由于RSA等非对称加密算法对原文长度有限制,且算法效率没有对称加密高,在实际应用中通常被用于传递对称加密算法的密钥(通常是一个随机值),然后通信双方使用对称加密算法保证数据安全。
 
数字签名
数字签名是一份数据经过特定的算法计算后得出的特殊标识,用来防止数据在传输过程中被伪造或篡改,是非对称加密技术与数字摘要技术的综合应用。
数字摘要
- 数字摘要指可以将任意长度的数据,通过一个摘要算法计算得到的固定长度的数据。也就是说摘要算法可以将很长的数据变为一个固定长度的数据,通常计算得出的数据要比原始数据短得多,所以被称为‘摘要’,典型的摘要算法有MD5和SHA1。
 数字摘要算法具有以下重要特性:
- 原数据不同,计算得到的摘要一定不同,反之,原数据不变,计算得到的摘要一定相同。
 - 无法通过摘要逆运算获得原数据,即摘要计算不可逆。
 - 任意长度的输入数据,经过计算都会得出固定长度的摘要。
 
加密算法和摘要算法的区别
- 加密后的密文可以使用对应的密钥进行解密,获取原文;摘要是不能进行逆向解密的
 - 加密之后的密文的长度不定;摘要的长度是确定的
 - 非对称加密对明文的长度有限制;摘要对明文长度无限制
 
应用场景
非对称加密技术能够确保只有持有密钥对的双方才能获取到正确的数据,但对加密原文的长度有限制,而数字摘要算法能够将输入数据转换为固定长度的摘要,并保证在原数据不变的情况下,摘要计算结果是一致的。这两项技术的特性的结合,就形成了数字签名的经典应用场景:
- 发送者使用MD5(或SHA1)算法提起原文摘要,然后使用私钥对摘要进行加密,把密文与原文一起传送给接收者。
 - 接收者使用公钥对密文进行解密,获得摘要,然后使用与发送者一样的摘要算法MD5(或SHA1)对原文提取摘要,比较两个摘要是否相等
 - 摘要相等,说明原文完整且没有被篡改;不相等,说明原文不正确。
 
- 数字签名有两种作用:1. 在私钥没有泄漏的情况下,能够确保数据是由发送方签名发送的。 2.能够确保数据是完整的且没有被篡改。但是数据本身是否加密,并不是数字签名的作用范畴,因为加密的是摘要,并不是数据本身。
RSA和数字签名在Https协议通信中有经典的应用,这里不再赘述。
 
RSA和数字签名在开放平台中的应用
在开放平台中,RSA和数字签名多用于开发者接入的身份验证。
RSA的应用
独立开发者接入平台时,使用RSA算法作为开发者身份验证的核心算法,如云信通IM平台即使用此种模式。开发者接入平台时,需要如下几个步骤:
- 创建一个应用app,平台会分配一个SDKAPPID
 - 将SDKAPPID关联到一对RSA的公钥和私钥上,公钥和私钥由平台生成
 - 由云信通IM平台持有公钥,开发者持有私钥
 - 开发者的服务每次调用平台接口时,需要携带使用指定参数和私钥生成的签名,生成签名的公式为:RSA(私钥,SDKAPPID,用户id)
 - 云平台会验证每次接口调用中传入的签名和用户id,首先使用公钥对签名解密,然后验证SDKAPPID是否合法,比对用户id,保证用户id不会被篡改。
 - 每个签名具有默认的有效期,也就是说,在私钥不变的情况下,一个用户的签名在有效期内是可以反复使用的
 
- 在独立开发者接入平台的场景中,开发者自己需要保证私钥的安全,且用户登陆的验证由开发者的后端服务来执行,平台并不负责验证用户是否登陆,平台仅需要验证服务的调用方是否是合法的开发者。经典的交互流程如下所示:
 

数字签名的应用
SHA1哈希算法生成数字签名也被应用于独立开发者接入模式,如融云开放平台、网易云信就使用此模式。开发者接入平台时,需要如下几个步骤:
- 开发者申请接入平台,由平台分配AppKey和Secret,Secret由开发者确保安全
 在所有平台服务端 API 接口的请求中,都需要附带以下4个HTTP Request Header:
| 名称| 类型 | 说明 |
| AppKey | String | 平台分配的 App Key |
| Nonce| String | 随机数,长度无限制 |
| Timestamp | String | 时间戳 |
| Signature | String | 数字签名 |- 数字签名是用于检验开发者是否合法的关键,其生成方式为:App Secret、Nonce (随机数)、Timestamp (时间戳)三个字符串按先后顺序拼接成一个字符串并进行 SHA1 哈希计算。
 
这种开发者接入模式中,数字签名起到几个作用:
- 用于验证开发者的合法性
 - 用于保证关键参数如AppKey,Timestamp不被篡改(前提是开发者保证了Secret的安全)
 SHA1没有明文长度的限制,这也是其比RSA算法有优势的地方,但SHA1算法是摘要算法,其计算出来的结果是无法解密的。
RSA/SHA1加密和数字签名算法在开放平台中的应用的更多相关文章
- RSA 非对称加密 数字签名 数字证书
		
什么是RSA加密算法 RSA加密算法是一种非对称加密算法,算法的数学基础是极大数分解难题. RSA加密算法的强度也就是极大数分解的难度,目前700多位(二进制)的数字已经可以破解,1024位认为是比较 ...
 - php  RSA非对称加密 的实现
		
基本概念 加密的意义 加密的意义在于数据的传输过程中,即使被第三方获取到传输的数据,第三方也不能获取到数据的具体含义. 加密方式分为对称加密和非对称加密 什么是对称加密? 对称加密只使用一个秘钥,加密 ...
 - shared SDK 微信开放平台遇到的问题
		
shared sdk是用于集成到app中,方便快速社交化分享的组件,其使用方法比较简单,参考官网的快速集成步骤就能搞定.稍微麻烦一点的就是需要到各个开放平台去注册你的APP. 在各个开放平台注册好之后 ...
 - 新浪微博开放平台OAuth授权解决方案(含代码)
		
前几日一位朋友项目中需要使用新浪微博的接口,故和这位朋友一同研究了新浪微博开放平台上面所提供的资料,首先要使用这些接口是需要用户登录并且授权的,新浪微博开放平台其实是提供两种授权方式的,第一种是:OA ...
 - OAuth简介及sina微博开放平台
		
OAuth简介及sina微博开放平台 2010-10-26 13:15:25 标签:新浪 sina 微博 OAuth 开放平台 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者 ...
 - 微信开放平台创建android应用时怎么获取应用签名
		
之前微信开放平台中申请创建应用,没有整理,过了好久,又重新百度,今天索性整理了,以供童鞋们备用. 1.微信开发平台注册申请成开发者账号,就此略过 2.在管理中心选择创建移动应用.按照严格要求填写.上传 ...
 - 第十四章 数字签名算法--RSA
		
注意:本节内容主要参考自 <Java加密与解密的艺术(第2版)>第9章“带密钥的消息摘要算法--数字签名算法” <大型分布式网站架构(设计与实践)>第3章“互联网安全架构” 1 ...
 - 数字签名算法rsa
		
数字签名算法消息传递模型 由消息发送方构建密钥对,这里由甲方完成. 由消息发送方公布公钥至消息接收方,这里由甲方将公钥公布给乙方. 注意如加密算法区别,这里甲方使用私钥对数据签名,数据与签名形成一则消 ...
 - 支付宝开放平台 配置RSA(SHA1)密钥 OpenSSL配置公钥私钥对
		
进入到第一次配置支付宝支付服务了 配置支付宝服务,需要去支付宝的开放平台申请服务 需要设置一些参数 其中需要在后台设置配置RSA(SHA1)密钥(公钥(注意这个子读"yao")) ...
 
随机推荐
- Saltstack报错小记
			
这是之前的一篇文章,由于有小伙伴也遇到同样的错误,就拿出来分享下吧 [root@master ~]# salt 'minion.saltstack.com' state.sls init.pkg[ER ...
 - wiki Confluence 百科介绍
			
Confluence是一个专业的wiki程序. 它是一个知识管理的工具, 通过它可以实现团队成员之间的协作和知识共享. Confluence不是一个开源软件, 非商业用途可以免费使用. Conflue ...
 - [R] R dataframe 中对列使用sort或者order的注意
			
存在这样的需求: 针对每列的值, 对列进行排序. 这样处理过数据后, 在excel中对数据作图时, 使数据呈现有序. R中sort数据的时候, 如果数据中存在字符串, R会将数据转化为characte ...
 - BZOJ.3453.tyvj 1858 XLkxc(拉格朗日插值)
			
BZOJ 题意即求\[\sum_{i=0}^n\sum_{j=1}^{a+id}\sum_{x=1}^jx^k\] 我们知道最后一个\(\sum\)是自然数幂和,设\(f(n)=\sum_{x=1}^ ...
 - python基础一 ------如何根据字典值对字典进行"排序"
			
需求:{姓名:成绩} 的字典,按成绩进行排序 方法一:转化为元组,(91,"张三")的形式 ,用sorted()函数进行排序 方法二 :设置sorted() 中key的参数的值 # ...
 - Tomcat安装与环境变量的配置
			
Tomacat的下载 去Tomcat官网下载,我使用的是apache-tomcat-7.0.78的版本. 安装 下载完成之后,我们解压缩到相应的目录.这里我解压缩到d盘下面 1.然后去配置系统的环 ...
 - BUG——Celery ValueError: not enough values to unpack
			
背景 最近因项目需要,学习任务队列Celery的用法,跟着官网写Demo,出现如题错误,最终在github的Issues里找到解决办法,记录如下. 场景还原 本地环境如下: Windows 7 Pyt ...
 - mongodb副本集出现的错误 mongodb error:  { MongoNetworkError: failed to connect to server [127.0.0.1:1010] on first connect [MongoNetworkError: connect ECONNREFUSED 127.0.0.1:1010]
			
replset = pictureWorks 执行:mongo --port 1008 (查看1008是否是住数据库) rs.status() 执行: onfig={"_id": ...
 - Linux引导程序类型
			
Bootloader Monitor 描述 X86 ARM PowerPC LILO 否 Linux磁盘引导程序 是 否 否 GRUB 否 GNU的LILO替代程序 是 否 否 Loadlim 否 从 ...
 - C_求两个日期相隔的天数(闰年)
			
#include <stdio.h> #include <math.h> int leap_year(int year){ == || (year%== && ...