Kong的插件: hmac

hmac简述

hmac是Hashing for Message Authentication的简写,可以用来保证数据的完整,客户端把内容通过散列/哈希算法算出一个摘要,并把算法和内容以及摘要传送给服务端,服务端按照这个算法也算一遍,和摘要比一下如果一样就认为内容是完整的,如果不一样就认为内容被篡改了。

关于Kong的hmac说几点

  • Clock Skew
    使用Kong的hmac后,请求必须带有Date和x-date请求头,这个是防止重放攻击(Replay Attacks),默认的情况下,客户端传过来的时间和服务端的时间相差300s,Kong就认为这个请求是有问题的。这个值可以修改的,通过修改config.clock_skew的参数
  • Headers的完整性
    使用Kong的hmac来确保请求头的完整性。具体要确保那个头,这个也是可以配置的,下面会演示。官方推荐,最差应该是 request-line, host, and date这三个头,最好是全部的头。
  • Body的完整性
  • 使用Kong的hmac可以确保请求内容的完整性,下面会演示

确保请求头的完整性

  • 基础环境准备
    你要有一个正常的route和service,如果没有的话,可以参考https://blog.csdn.net/u014686399/article/details/100084613,我的试验也是基于这个博客的

  • 针对服务启用插件

/services/2fc52878-1fe9-48ba-bc45-146da3822851/plugins
{
	"name":"hmac-auth",
	"config": {
		"enforce_headers": ["testhamc"],
		"algorithms": ["hmac-sha1", "hmac-sha256"]
	}
}
  • 2fc52878-1fe9-48ba-bc45-146da3822851这个是服务的id,当然你可以针对route启用插件
  • hmac-auth这个是固定值, 插件的名字
  • config.enforce_headers这是指定你要校验的头,我这里用了一个testhamc,如果你是生产环境还是遵循一下官网的建议吧
  • 创建一个consumer
consumers/ POST
{
	"username":"xjj_user_01",
	"custom_id":"users_001"
}
  • 创建证书
/consumers/f4c713c0-6bf1-4079-83a0-135180d6ba53/hmac-auth  POST
{
	"username":"rita",
	"secret":"123.com"
}
  • f4c713c0-6bf1-4079-83a0-135180d6ba53这个是consumer的id
  • secret是用来做算法的key的,算法一般会用sha256或者sha1
  • 测试
    • 直接访问
      Kong的插件: hmac_第1张图片
      可以看到直接访问不了了
    • 添加Authorization头
#  首先确定一下testhamc头,因为这是我自定义的头,所以值我就自定义为123456
#  做签名,我是通过一个python脚本实现的
import hashlib
import hmac
import base64
	
message = "testhamc: 123456" # 这里写你要加密的内容
secret = "123.com"  # 这里写Key,是证书的 secret
	
signature = base64.b64encode(hmac.new(secret, message, digestmod=hashlib.sha256).digest())
print(signature)
运行脚本,会输出签名

在这里插入图片描述
再次访问

curl -i -X GET http://172.16.0.92:31545/xjj_tv/main \
      -H "testhamc: 123456" \
      -H 'Authorization: hmac  username="rita", algorithm="hmac-sha256", headers="testhamc", signature="cnKy69DPkd1rycOvz5biWTJ6rk/UObLAXrNzEOCF4TE="'
  • username是证书的用户名
    Kong的插件: hmac_第2张图片
    会提示我们添加一个DATE的头
  • 添加后再访问
curl -i -X GET http://172.16.0.92:31545/xjj_tv/main \
      -H "Date: Web, 28 Aug 2019 09:09:00 GMT" \
      -H "testhamc: 123456" \
      -H 'Authorization: hmac  username="rita", algorithm="hmac-sha256", headers="testhamc", signature="cnKy69DPkd1rycOvz5biWTJ6rk/UObLAXrNzEOCF4TE="'
  • DATE是 GMT格式的,和服务器上不能相差300秒
    Kong的插件: hmac_第3张图片
    访问通过了

确保body的完整性

  • 确定一个body
body肯定是事先确定的,我这里定的内容是 xiaojiejiehao
  • 制作body的签名,我是通过Python实现的
import hashlib
import base64

message = b"xiaojiejiehao" # 这里写你要加密的内容
x = hashlib.sha256()
x.update(message)

signature = base64.b64encode(x.digest())
print(signature.decode("utf-8"))

Kong的插件: hmac_第4张图片

  • 测试
curl -i -X GET http://172.16.0.92:31545/xjj_tv/main   -H "Date: Web, 28 Aug 2019 10:20:00 GMT"  -H "testhamc: 123456"        -H 'Authorization: hmac  username="rita", algorithm="hmac-sha256", headers="testhamc", signature="cnKy69DPkd1rycOvz5biWTJ6rk/UObLAXrNzEOCF4TE="' -H "Digest: SHA-256=l12ueyMM3AyCTH8uE9Cs3PVF1ZGR29rhi1l+SsuJzEI="  -d "xiaojiejiehao"

Kong的插件: hmac_第5张图片测试通过


先写到这里了,有问题进QQ群630300475

你可能感兴趣的:(KONG)