在上文已经讲述了基础介绍,这篇文章详细讲解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。
可以关注本人的公众号,多年经验的原创文章共享给大家。