• 如何设计提高服务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。

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

  • 相关阅读:
    VS中的 MD/MT设置 【转】
    VS2010/MFC编程入门之五十四(Ribbon界面开发:使用更多控件并为控件添加消息处理函数)
    VS2010/MFC编程入门之五十三(Ribbon界面开发:为Ribbon Bar添加控件)[转]
    [MFC]选择目录对话框和选择文件对话框 [转]
    NMM3DViewer 设计
    将可执行程序的内存空间扩展到3GB(windows)
    centos7 安装rocketmq(quick start)
    Centos7 安装 Maven 3.5.*
    ss命令
    强制重启Linux系统的几种方法
  • 原文地址:https://www.cnblogs.com/alunchen/p/11598091.html
Copyright © 2020-2023  润新知