在上文已经讲述了基础介绍,这篇文章详细讲解API密钥方式。

利用何种加密方式呢?

经过上面加密算法的理解,单向加密不仅性能高,而且有压缩性,即长度一致,有效减少网络传输过程中的字节大小。适合我们这种调用服务API的方式。所以我们使用不可逆的加密算法,选择SHA。

因为服务API是供所有企业/个人使用,一个企业/个人可理解为一个租户。如果都使用SHA来加密日期+AccessKeyId的话,不安全。所以需要用密钥生成,就需要用到HMAC算法。HMAC即利用密钥来生成固定长度的hash加密值,提高安全性。即做了两层防御。第一层使用SHA,第二层使用HMAC。所以有很流行的HMACSHA加密算法,即他们的结合体,HMAC为SHA加盐。

根据需求,为何使用这种模式?

      第一,时间有效性。利用日期字段来降低加密后的密钥被盗用的风险。传输过程中,即使给盗用传输值,也只有xx分钟(这里设置10分钟)的有效期。

第二,效率快,耗CPU少。单向加密性能较高,无需解密。

第三,所有平台代码通用。例如c#、java、python等。

流程详解

在使用服务前,首先企业/个人需要登陆我们的系统,来进行用户注册。注册完成之后,申请我们的服务使用。申请服务使用成功后,会给到用户调用服务API的两个关键密钥信息AccessKeyId、AccessKeySecret。AccessKeyId是密钥的Id,AccessKeySecret是密钥值,所以AccessKeySecret是属于高密信息,不能泄露。下面是流程图:

在客户端,使用服务时,为了安全性,服务这边需要生成加密后的hash值,并且通过消息头的方式,传送hash值、日期、AccessKeyId到服务器。

hash值的生成:是明文字符串=当前日期+AccessKeyId,然后通过密钥AccessKeySecret加密明文字符串,最后得到hash值。

在服务端,接受到消息头的三个信息:当前日期、AccessKeyId、加密后的hash值。首先服务器取得当前日期,与传送过来的日期做对比,看是否过期(10分钟),过期则返回调用失败。

然后使用AccessKeyId在DB或者缓存找到AccessKeySecret,生成hash加密后的字符串。再与传送过来的hash加密后的字符串做对比,如果相等,则可以调用API,否则放回失败信息。如下图:


相关.net core代码展示(.net代码也一样)

生成HMAC SHA265:

/// <summary>

/// Hmac Sha256加密

/// </summary>

/// <param name="text"></param>

/// <param name="key"></param>

/// <returns></returns>

public static string GetHash(string text, string key)

{

UTF8Encoding encoding = new UTF8Encoding();

Byte[] textBytes = encoding.GetBytes(text);

Byte[] keyBytes = encoding.GetBytes(key);

Byte[] hashBytes;

using (HMACSHA256 hash = new HMACSHA256(keyBytes))

hashBytes = hash.ComputeHash(textBytes);

return BitConverter.ToString(hashBytes).Replace("-", "").ToLower();

}

总结

在上述过程中,你可以使用租户Id来替换AccessKeyId来提高安全性。如果这样还觉得不安全,可以用可逆加密算法,对AccessKeyId进行加密后传输。

上述过程利用了HMACSHA加密算法,对日期与AccessKeyId进行了加密。再利用日期来提高被盗用的安全性。

我们这里使用的SHA是使用SHA256算法。目前国内很多公司是使用SHA1。

可以关注本人的公众号,多年经验的原创文章共享给大家。

如何设计提高服务API的安全性(二)API密钥方式详解的更多相关文章

  1. RocketMQ详解(二)安装使用详解

    专题目录 RocketMQ详解(一)原理概览 RocketMQ详解(二)安装使用详解 RocketMQ详解(三)启动运行原理 RocketMQ详解(四)核心设计原理 RocketMQ详解(五)总结提高 ...

  2. (原创)LAMP搭建之二:apache配置文件详解(中英文对照版)

    LAMP搭建之二:apache配置文件详解(中英文对照版) # This is the main Apache server configuration file. It contains the # ...

  3. Zookeeper系列二:分布式架构详解、分布式技术详解、分布式事务

    一.分布式架构详解 1.分布式发展历程 1.1 单点集中式 特点:App.DB.FileServer都部署在一台机器上.并且访问请求量较少 1.2  应用服务和数据服务拆分  特点:App.DB.Fi ...

  4. Velocity魔法堂系列二:VTL语法详解

    一.前言 Velocity作为历史悠久的模板引擎不单单可以替代JSP作为Java Web的服务端网页模板引擎,而且可以作为普通文本的模板引擎来增强服务端程序文本处理能力.而且Velocity被移植到不 ...

  5. Java8初体验(二)Stream语法详解(转)

    本文转自http://ifeve.com/stream/ Java8初体验(二)Stream语法详解 感谢同事[天锦]的投稿.投稿请联系 tengfei@ifeve.com上篇文章Java8初体验(一 ...

  6. Java8初体验(二)Stream语法详解---符合人的思维模式,数据源--》stream-->干什么事(具体怎么做,就交给Stream)--》聚合

    Function.identity()是什么? // 将Stream转换成容器或Map Stream<String> stream = Stream.of("I", & ...

  7. 第15.10节 PyQt(Python+Qt)入门学习:Qt Designer可视化设计界面组件与QWidget类相关的组件属性详解

    PyQt学习有阵子了,对章节的骨架基本考虑好了,准备本节就写组件的属性的,结果一是日常工作繁忙,经常晚上还要加班,二是Qt的组件属性很多,只能逐一学习.研究和整理,花的时间有点长,不过终于将可视化设计 ...

  8. Hadoop Mapreduce分区、分组、二次排序过程详解[转]

    原文地址:Hadoop Mapreduce分区.分组.二次排序过程详解[转]作者: 徐海蛟 教学用途 1.MapReduce中数据流动   (1)最简单的过程:  map - reduce   (2) ...

  9. Python学习二:词典基础详解

    作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7862377.html 邮箱:moyi@moyib ...

随机推荐

  1. 201871010131-张兴盼《面向对象程序设计(java)》第十一周学习总结

    项目 内容 <面向对象程序设计(java)> https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/ ...

  2. shiro 基本知识测试

    shiro 基本知识测试 <!--shiro核心包--> <dependency> <groupId>org.apache.shiro</groupId> ...

  3. wafer2的keng

    一.之前用wafer2开发的小程序,今天突然Error: 用户未登录过,请先使用 login() 登录? 答:改用qcloud.login, 替换掉qcloud.loginWithCode (小程序代 ...

  4. java 获取用户输入

    import java.util.Scanner; public class Sample { public static void main(String[] args) { int num; Sc ...

  5. python开发--信息处理系统

    #!/usr/bin/python card_list=[] #定义列表变量 def show_menu(): print("*" * 10) print("名片管理系统 ...

  6. Windows10 WSL下 龙芯3A 交叉编译环境搭建

    记个流水账避免事后忘记怎么搭建的 - - 环境 Key Value 系统 Windows10 WSL系统 Ubuntu 下载工具链 http://www.loongnix.org/index.php/ ...

  7. 在 Vue 中使用 装饰器 Decorator

    Decorator 的语法还没有通过提案,所以项目中很少用.不过最近刚好有一个需求用到了. 装饰器的语法 http://es6.ruanyifeng.com/#docs/decorator 需求是,有 ...

  8. 第21课 shared_ptr共享型智能指针

    一. shared_ptr的基本用法 (一)与unique_ptr的比较 比较 shared_ptr unique_ptr 备注 初始化 ①shared_ptr<T> sp; sp.res ...

  9. base62与long的相互转换

    public static class Converter { private static String keys = "0123456789abcdefghijklmnopqrstuvw ...

  10. 了解jsp,这一篇就够了.

    jsp的执行过程: 1 客户端发出请求. 2 Web容器将JSP转译成Servlet源代码. 3 Web容器将产生的源代码进行编译. 4 Web容器加载编译后的代码并执行. 5 把执行结果响应至客户端 ...