加密算法

加密算法分为两大类: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是一个能够同时用于加密和数字签名的算法,典型的应用场景:隐藏原文、防止原文被篡改、身份认证。隐藏原文是所有加密算法的通用功能(要不然怎么叫加密),防止原文被篡改是数字签名的功能,数据传输的具体流程如下:

    1. 甲方构建密钥对,将公钥交给乙方
    2. 甲方使用私钥加密原文,然后将加密数据发送给乙方。乙方使用公钥对签名进行解密,获取原文,如果解密失败,则原文被篡改。
    3. 乙方给甲方发送原文的时候,先使用公钥对原文加密,将加密数据发送给甲方。甲方使用私钥对签名解密,获取原文,如果解密失败,则原文被篡改。
  • 如果第三方不知道密钥对,则第三方什么都做不了。如果第三方知道公钥,则第三方对甲方的原文具有与乙方一样的阅读权限,但无法篡改甲方的原文,因为没有私钥,无法生成合法的数字签名。
  • RSA对一次加密的明文的长度是有要求的,在不同的padding模式下,能加密的明文长度也不相同。以RSA 1024为例,输入的明文的字节数不能超过钥模长1024bits,即最长为128bytes。RSA 1024的不同padding模式下的明文长度的最大值计算公式:

    1. RSA_PKCS1_PADDING RSA_size(1024) - 11 = 117bytes
    2. RSA_PKCS1_OAEP_PADDING RSA_size(1024) - 41 = 87bytes
    3. RSA_NO_PADDING RSA_size(1024) = 128bytes
  • 由于RSA等非对称加密算法对原文长度有限制,且算法效率没有对称加密高,在实际应用中通常被用于传递对称加密算法的密钥(通常是一个随机值),然后通信双方使用对称加密算法保证数据安全。

数字签名

数字签名是一份数据经过特定的算法计算后得出的特殊标识,用来防止数据在传输过程中被伪造或篡改,是非对称加密技术与数字摘要技术的综合应用。

数字摘要

  • 数字摘要指可以将任意长度的数据,通过一个摘要算法计算得到的固定长度的数据。也就是说摘要算法可以将很长的数据变为一个固定长度的数据,通常计算得出的数据要比原始数据短得多,所以被称为‘摘要’,典型的摘要算法有MD5和SHA1。
  • 数字摘要算法具有以下重要特性:

    1. 原数据不同,计算得到的摘要一定不同,反之,原数据不变,计算得到的摘要一定相同。
    2. 无法通过摘要逆运算获得原数据,即摘要计算不可逆。
    3. 任意长度的输入数据,经过计算都会得出固定长度的摘要。

加密算法和摘要算法的区别

  • 加密后的密文可以使用对应的密钥进行解密,获取原文;摘要是不能进行逆向解密的
  • 加密之后的密文的长度不定;摘要的长度是确定的
  • 非对称加密对明文的长度有限制;摘要对明文长度无限制

应用场景

  • 非对称加密技术能够确保只有持有密钥对的双方才能获取到正确的数据,但对加密原文的长度有限制,而数字摘要算法能够将输入数据转换为固定长度的摘要,并保证在原数据不变的情况下,摘要计算结果是一致的。这两项技术的特性的结合,就形成了数字签名的经典应用场景:

    1. 发送者使用MD5(或SHA1)算法提起原文摘要,然后使用私钥对摘要进行加密,把密文与原文一起传送给接收者。
    2. 接收者使用公钥对密文进行解密,获得摘要,然后使用与发送者一样的摘要算法MD5(或SHA1)对原文提取摘要,比较两个摘要是否相等
    3. 摘要相等,说明原文完整且没有被篡改;不相等,说明原文不正确。
  • 数字签名有两种作用:1. 在私钥没有泄漏的情况下,能够确保数据是由发送方签名发送的。 2.能够确保数据是完整的且没有被篡改。但是数据本身是否加密,并不是数字签名的作用范畴,因为加密的是摘要,并不是数据本身。

    RSA和数字签名在Https协议通信中有经典的应用,这里不再赘述。

RSA和数字签名在开放平台中的应用

在开放平台中,RSA和数字签名多用于开发者接入的身份验证。

RSA的应用

  • 独立开发者接入平台时,使用RSA算法作为开发者身份验证的核心算法,如云信通IM平台即使用此种模式。开发者接入平台时,需要如下几个步骤:

    1. 创建一个应用app,平台会分配一个SDKAPPID
    2. 将SDKAPPID关联到一对RSA的公钥和私钥上,公钥和私钥由平台生成
    3. 由云信通IM平台持有公钥,开发者持有私钥
    4. 开发者的服务每次调用平台接口时,需要携带使用指定参数和私钥生成的签名,生成签名的公式为:RSA(私钥,SDKAPPID,用户id)
    5. 云平台会验证每次接口调用中传入的签名和用户id,首先使用公钥对签名解密,然后验证SDKAPPID是否合法,比对用户id,保证用户id不会被篡改。
    6. 每个签名具有默认的有效期,也就是说,在私钥不变的情况下,一个用户的签名在有效期内是可以反复使用的
  • 在独立开发者接入平台的场景中,开发者自己需要保证私钥的安全,且用户登陆的验证由开发者的后端服务来执行,平台并不负责验证用户是否登陆,平台仅需要验证服务的调用方是否是合法的开发者。经典的交互流程如下所示:

数字签名的应用

  • SHA1哈希算法生成数字签名也被应用于独立开发者接入模式,如融云开放平台、网易云信就使用此模式。开发者接入平台时,需要如下几个步骤:

    1. 开发者申请接入平台,由平台分配AppKey和Secret,Secret由开发者确保安全
    2. 在所有平台服务端 API 接口的请求中,都需要附带以下4个HTTP Request Header:

      | 名称| 类型 | 说明 |
      | AppKey | String | 平台分配的 App Key |
      | Nonce| String | 随机数,长度无限制 |
      | Timestamp | String | 时间戳 |
      | Signature | String | 数字签名 |
    3. 数字签名是用于检验开发者是否合法的关键,其生成方式为:App Secret、Nonce (随机数)、Timestamp (时间戳)三个字符串按先后顺序拼接成一个字符串并进行 SHA1 哈希计算。
  • 这种开发者接入模式中,数字签名起到几个作用:

    1. 用于验证开发者的合法性
    2. 用于保证关键参数如AppKey,Timestamp不被篡改(前提是开发者保证了Secret的安全)
    3. SHA1没有明文长度的限制,这也是其比RSA算法有优势的地方,但SHA1算法是摘要算法,其计算出来的结果是无法解密的。

RSA/SHA1加密和数字签名算法在开放平台中的应用的更多相关文章

  1. RSA 非对称加密 数字签名 数字证书

    什么是RSA加密算法 RSA加密算法是一种非对称加密算法,算法的数学基础是极大数分解难题. RSA加密算法的强度也就是极大数分解的难度,目前700多位(二进制)的数字已经可以破解,1024位认为是比较 ...

  2. php RSA非对称加密 的实现

    基本概念 加密的意义 加密的意义在于数据的传输过程中,即使被第三方获取到传输的数据,第三方也不能获取到数据的具体含义. 加密方式分为对称加密和非对称加密 什么是对称加密? 对称加密只使用一个秘钥,加密 ...

  3. shared SDK 微信开放平台遇到的问题

    shared sdk是用于集成到app中,方便快速社交化分享的组件,其使用方法比较简单,参考官网的快速集成步骤就能搞定.稍微麻烦一点的就是需要到各个开放平台去注册你的APP. 在各个开放平台注册好之后 ...

  4. 新浪微博开放平台OAuth授权解决方案(含代码)

    前几日一位朋友项目中需要使用新浪微博的接口,故和这位朋友一同研究了新浪微博开放平台上面所提供的资料,首先要使用这些接口是需要用户登录并且授权的,新浪微博开放平台其实是提供两种授权方式的,第一种是:OA ...

  5. OAuth简介及sina微博开放平台

     OAuth简介及sina微博开放平台 2010-10-26 13:15:25 标签:新浪 sina 微博 OAuth 开放平台 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者 ...

  6. 微信开放平台创建android应用时怎么获取应用签名

    之前微信开放平台中申请创建应用,没有整理,过了好久,又重新百度,今天索性整理了,以供童鞋们备用. 1.微信开发平台注册申请成开发者账号,就此略过 2.在管理中心选择创建移动应用.按照严格要求填写.上传 ...

  7. 第十四章 数字签名算法--RSA

    注意:本节内容主要参考自 <Java加密与解密的艺术(第2版)>第9章“带密钥的消息摘要算法--数字签名算法” <大型分布式网站架构(设计与实践)>第3章“互联网安全架构” 1 ...

  8. 数字签名算法rsa

    数字签名算法消息传递模型 由消息发送方构建密钥对,这里由甲方完成. 由消息发送方公布公钥至消息接收方,这里由甲方将公钥公布给乙方. 注意如加密算法区别,这里甲方使用私钥对数据签名,数据与签名形成一则消 ...

  9. 支付宝开放平台 配置RSA(SHA1)密钥 OpenSSL配置公钥私钥对

    进入到第一次配置支付宝支付服务了 配置支付宝服务,需要去支付宝的开放平台申请服务 需要设置一些参数 其中需要在后台设置配置RSA(SHA1)密钥(公钥(注意这个子读"yao")) ...

随机推荐

  1. Hexo 搭建博客 本地运行 常见报错及解决办法

    作为一名在hexo方面的新手,我在使用hexo编辑文档时遇到了很多问题,hexo generate编译的时候遇到了各种错误. 在此将这些错误及其解决方案记录下来,以便日后查证之用,同时,也可给各位在遇 ...

  2. 一次ARP病毒排查

    XX公司网络卡断问题 1.  问题现象 2017年XX公司机关网络出现几次异常情况,并寻求内外部专家对异常情况进行诊断分析,均未找到原因,具体情况如下: 1.XX分公司机关网络IP地址为10.0.0. ...

  3. Ajax状态值及状态码整理

    1- AJAX状态值与状态码区别 AJAX状态值是指,运行AJAX所经历过的几种状态,无论访问是否成功都将响应的步骤,可以理解成为AJAX运行步骤.如:正在发送,正在响应等,由AJAX对象与服务器交互 ...

  4. MySql主键不区分大小写问题、查询不区分大小写问题

    一.问题一:MySql默认主键不区分大小写 实例: -- 创建混合类型 create table PlainText( Content nvarchar(50) , primary key(Conte ...

  5. linux上安装mysql,亲试成功

    安装mysql参考 网址https://blog.csdn.net/a774630093/article/details/79270080 本文更加详细. 1.先检查系统是否装有mysql rpm - ...

  6. 移动游戏ui设计(二)--游戏世界的基本法则

    游戏世界的基本法则游戏体验的层次感很重要,制作一款趣味性强,宗旨明确的游戏并不简单. l  风格统一性:要先明白游戏的game genres,因为游戏类型与风格密切联系.常见游戏类型有:动作类.冒险类 ...

  7. Linux 压缩解压缩

    先直接给出各种解压缩命令 .tar 压缩:tar cvf FileName.tar FileName 解压:tar xvf FileName.tar ------------------------- ...

  8. flask之基础知识点

    本篇导航: 路由系统 视图函数 请求与响应 模版语法 session 蓝图(blueprint).闪现 (flash) 扩展 一.路由系统 1.可传入参数: @app.route('/user/< ...

  9. python之使用set对列表去重,并保持列表原来顺序(转)

    https://www.cnblogs.com/laowangball/p/8424432.html #原始方法,但是会打乱顺序 mylist = [1,2,2,2,2,3,3,3,4,4,4,4]m ...

  10. 如何在一小时内更新100篇文章?-Evernote Sync插件介绍

    上一篇"手把手教你制作微信小程序,开源.免费.快速搞定",已经教会你如何快速制作一个小程序,但作为资讯类小程序,内容不可少,并且还需要及时更新. 但是,如果让你复制粘贴,可能还需要 ...