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

原文地址:https://www.cnblogs.com/colder/p/10326357.html

时间: 2024-08-04 16:09:06

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

百度开放平台中的地理功能介绍

如果你想手机开发或微信开发,哪么本地化将是一个非常大的市场,哪么怎么实现本地化数据分析呢!百度开放平台提供了LBS平台,提供了API服务,您的程序可以通过这些接口获取自己的本地化数据. 1.Place Suggestion API 这是一个地区名称相关词的搜索功能,您可以提供给接口一个“天安门”三个字,接口给你返回了“天安门东.天安门城楼.天安门西.天安门仿膳”等相关地名的搜索词汇. 2.Geocoding API v2.0 这是一个叫做“地址解析和逆地址解析功能”,这个功能你可以通过提供给这个

微信开放平台中的 网页授权出问题了

今天是不是微信的服务器出问题了,我们所有的公众号,OAuth2.0网页授不能正常使用了,原来是由于连接不到微信的授权服务器了,异常信息如下: org.apache.http.conn.ConnectTimeoutException: Connect to api.weixin.qq.com:443 [api.weixin.qq.com/140.206.160.101] failed: Connection timed out at java.lang.reflect.Method.invoke(

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

shared sdk是用于集成到app中,方便快速社交化分享的组件,其使用方法比较简单,参考官网的快速集成步骤就能搞定.稍微麻烦一点的就是需要到各个开放平台去注册你的APP. 在各个开放平台注册好之后得到对应的app ID填入到sharesdk的配置xml文件当中即可. 这里稍微麻烦一点的就是微信,是需要用自己的keystore中间的key对应用签名,然后再在开放平台上填写这个signature才能调试(网上都这么说,但是我用Android Studio的debug key签名的也能分享到朋友圈

微信公众平台和开放平台的区别

由于业务的需要,我们需要需要微信的相关信息,有时需要基于微信平台开发网站,有时需要在PC上微信登录. 实际开发的时候,面对两个平台,初学者比较茫然,不知道什么时候用哪个平台. 我分享一下我的见解: 微信公众平台: 许多公司在做网站的时候,先做PC版,再做手机版. 但是手机版网站还是需要手机浏览器输入网址或者扫二维码进入,不是很方便. 那自然想到的是开发APP,但是公司要考虑成本,APP成本太高. 使用微信公众平台就是很好的办法. 1.可以利用微信提供的管理平台或者微信提供的接口进行开发,直接拥有

Java数字签名算法--RSA

签名具有的特性: 安全性 抗否认性 数字签名:带有密钥(公钥.私钥)的消息摘要算法(使用私钥进行签名,使用公钥进行验证) 数字签名算法:RSA.DSA.ECDSA 数字签名特性: 验证数据完整性 认证数据来源 抗否认性 经典算法 MD.SHA两类 数字签名算法-RSA的执行过程 代码: package com.chengxuyuanzhilu.rsa; import java.security.InvalidKeyException; import java.security.KeyFactor

RSA 数字签名算法(Java版)

数字签名算法Java版 还是上代码吧 public static final String SIGN_ALGORITHMS = "SHA1WithRSA"; /** * RSA签名 * @param content 待签名数据 * @param privateKey 私钥 * @param input_charset 编码格式 * @return 签名值 */ public static String sign(String content, String privateKey, St

.net core RSA 分段加密解密,签名验签(对接java)

参考地址: https://www.cnblogs.com/stulzq/p/7757915.html https://www.cnblogs.com/stulzq/p/8260873.html https://github.com/stulzq/RSAExtensions(XC.RSAUtil) https://www.cnblogs.com/stulzq/p/12053976.html https://github.com/stulzq/RSAExtensions (RSAExtension

再谈加密-RSA非对称加密的理解和使用

html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption

我的Android进阶之旅------>Android采用AES+RSA的加密机制对http请求进行加密

前言 未加密的抓包截图 加密之后的抓包截图 基本需求及概念 AES算法 AES基本原理及算法流程 AES算法流程 RSA算法 RSA算法基本原理及流程 RSA算法实现流程 AES与RSA相结合数据加密方案 Android端 AESRSA结合实践 基本要求 基本流程 Android端 服务器端 java版示例 更多参考 前言 最近维护公司APP应用的登录模块,由于测试人员用Fiddler抓包工具抓取到了公司关于登录时候的明文登录信息.虽然使用的是HTTPS的方式进行http请求的,但还是被Fidd