教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 接口安全机制

接口安全机制

发布时间:2022-02-26   编辑:jiaochengji.com
教程集为您提供接口安全机制等资源,欢迎您收藏本站,我们将为您提供最新的接口安全机制资源

HMAC-SHA1(基于SHA1哈希算法的消息验证代码) 是一种键控哈希算法。 此 HMAC 进程将密钥与消息数据混合,使用哈希函数对混合结果进行哈希计算,将所得哈希值与该密钥混合,然后再次应用哈希函数。 输出的哈希值长度为 160 位。

虽然安全哈希算法(Secure Hash Algorithm,简称SHA1)是一种不可逆的加密算法,但是由于同样的内容计算之后结果是相同的,且不会重复,所以通过暴力计算,也是能够还原数据。所以HMAC-SHA1就在SHA1的基础上,增加一个密钥。如此一来,只要密钥不被泄漏,就无法破解信息内容。

在接口验证过程中,将要发送的数据参数,再加上要发送时刻的时间片和密钥,通过HMAC-SHA1一并进行计算,请求的时候将计算得到的签名作为参数发送给服务器。服务器也要根据本地保存的密钥再计算一次,与客户端提供的签名进行对比。相同则为授权成功。

通过HMAC-SHA1做加密处理,可以防止请求参数被恶意修改。如果参数被修改,签名也会随之变化,所以单纯的修改参数将会导致服务器授权验证失败。再传入的参数之中再加入时间片信息,如果和服务器时间相差过大,该请求也会被抛弃。

基于beego框架实现接口验证,使用它提供的过滤器就能实现。过滤器函数如下所示:

<pre class="highlight"><code>beego.InsertFilter(pattern string, postion int, filter FilterFunc) </code></pre>

三个参数:

<ul><li>路由规则,可以根据一定的规则进行路由,如果你全匹配可以用<code class="highlighter-rouge">*</code></li> <li>postion 执行 Filter 的地方,四个固定参数如下,分别表示不同的执行过程 <ul><li>BeforeRouter 寻找路由之前</li> <li>BeforeExec 找到路由之后,开始执行相应的 Controller 之前</li> <li>AfterExec 执行完 Controller 逻辑之后执行的过滤器</li> <li>FinishRouter 执行完逻辑之后执行的过滤器</li> </ul></li> <li>filter filter 函数<code class="highlighter-rouge">type FilterFunc func(*context.Context)</code></li> </ul>

路由规则用来匹配过滤器。过滤的位置有4个。我们这里是要校验请求参数,那么调用得靠前一些,能够减少后面不必要的计算。所以用<code class="highlighter-rouge">BeforeRouter</code>较好。校验函数如下:

<pre class="highlight"><code>func FilterOauth(ctx *context.Context) { timestamp, err := strconv.ParseInt(ctx.Input.Query("timestamp"), 10, 64) if err != nil { ctx.Abort(http.StatusUnauthorized, "") } timestamp_t := time.Unix(timestamp, 0) now_t := time.Now() if now_t.Sub(timestamp_t).Minutes() > 10 { fmt.Println(timestamp_t, "Duration is too long") ctx.Abort(http.StatusUnauthorized, "") } size := ctx.Input.Query("size") if size == "" { ctx.Abort(http.StatusUnauthorized, "") } sign := ctx.Input.Query("sign") if sign == "" { ctx.Abort(http.StatusUnauthorized, "") } if CheckMAC(size timestamp_t.String(), sign, "seckey") { fmt.Println("Verify error") ctx.Abort(http.StatusUnauthorized, "") } } </code></pre>

校验是根据传入的参数<code class="highlighter-rouge">size</code>和<code class="highlighter-rouge">timestape</code>进行,还需要传入<code class="highlighter-rouge">sign</code>签名用于比对。过滤器函数传入了上下文对象<code class="highlighter-rouge">*context.Context</code>。如果传入的时间片和系统时间相差超过10分钟,会被认为是过期请求。

校验函数用了Golang的<code class="highlighter-rouge">crypto/hmac</code>和<code class="highlighter-rouge">crypto/sha1</code>包:

<pre class="highlight"><code>func CheckMAC(message, sign, key string) bool { mac := hmac.New(sha1.New, []byte(key)) mac.Write([]byte(message)) return hex.EncodeToString(mac.Sum(nil)) == sign } </code></pre>

加密的结果是<code class="highlighter-rouge">[]byte</code>类型,还需要转换成可读的16进制编码,通过包<code class="highlighter-rouge">encoding/hex</code>即可实现。

接口加密还可以使用HTTPS加密的传输方式,这个我还不懂,以后明白了再写。


######<em>参考文献</em> 【1】过滤器 - beego开发文档

原文链接:接口安全机制,转载请注明来源!


到此这篇关于“接口安全机制”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
.NET框架中基于角色的安全性(3)
安全狗屏蔽端口怎么解除?取消加入安全策略方法
GO接口应用场景说明
Win8.1下VMware虚拟机无法安装虚拟网卡怎么办?
360安全卫士彻底清除无法删除的文件 “文件粉碎机”一键搞定
PHP开发api接口安全验证
25个必须记住的ssh命令
解决电脑不能开机解救教程
Windows 2003下安装VS2008时.NetFramework3.5组件安装失败的解决方法
Windows 8更换Windows XP系统错误提示0x000000A5

[关闭]
~ ~