zoukankan      html  css  js  c++  java
  • 如何设计提高服务API的安全性(二)API密钥方式详解

    在上文已经讲述了基础介绍,这篇文章详细讲解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是属于高密信息,不能泄露。下面是流程图:

    clipboard

     

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

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

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

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

    clipboard

     

    相关.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。

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

  • 相关阅读:
    bzoj2733 永无乡 平衡树按秩合并
    bzoj2752 高速公路 线段树
    bzoj1052 覆盖问题 二分答案 dfs
    bzoj1584 打扫卫生 dp
    bzoj1854 游戏 二分图
    bzoj3316 JC loves Mkk 二分答案 单调队列
    bzoj3643 Phi的反函数 数学 搜索
    有一种恐怖,叫大爆搜
    BZOJ3566 概率充电器 概率dp
    一些奇奇怪怪的过题思路
  • 原文地址:https://www.cnblogs.com/alunchen/p/11598091.html
Copyright © 2011-2022 走看看