go-zero接口签名

官方教程在此:
https://go-zero.dev/docs/tutorials/api/signature
先说问题,这个教程只说明了怎么开启签名,但是服务端如何设置参数,以及客户端怎么签名并没有说。如果你对这东西怎么真正的投入使用感兴趣,下面的示例可以完成这个目标。

前提

官方的快速开始根本没开始,因为你没有尝试过怎么校验。在以下步骤前,你应该按照官方示例生成了代码。

服务端配置解读

第一步:
在线生成工具:https://oktools.net/rsa
生成 RSA 密钥文件。这里给个固定可以用的。
私钥

-----BEGIN RSA PRIVATE KEY-----
MIIBOwIBAAJBAOZrxt6gzYNcospmcnKkvdvJXOxePmc5uUN03mAVBPlSIOhE4J8h
dpeV/Qc85xt3cqlWYQi5xCMEHTe6noiors8CAwEAAQJBAIoWLtD+VwsROfHH4XB4
79rGWuzAMe+UtUUKxbWZAykR/rcad0uaaqbu2Jdt+RGO8BRG+cMBSftOaEC4ssu9
wIECIQD5gDbXmqETn6DSC+noNNwk+VNq1PPemOjzMLtMR0JZQQIhAOxsVF0F30hV
S1I+xto4QmX8W7MPGgUVWcLAyMSCVHQPAiBgEvMLSsvD1rACsfu8Ir6yrh9k/+N4
T8FEA/vbf4UZAQIhANKgSCB/pMZ6RppFFz8+M9lMFB3X7GRu+wLIYZTAT6D9AiBP
MG5ZjPR0mT7cLst77hBTItFHf+aBNb1QhU1cEAPbVg==
-----END RSA PRIVATE KEY-----

公钥

-----BEGIN RSA PUBLIC KEY-----
MEgCQQDma8beoM2DXKLKZnJypL3byVzsXj5nOblDdN5gFQT5UiDoROCfIXaXlf0H
POcbd3KpVmEIucQjBB03up6IqK7PAgMBAAE=
-----END RSA PUBLIC KEY-----

第二步:
改项目配置文件,加上以下密钥配置:

Signature:
  Strict: true                   # 是否开启校验,调试的时候可以关掉,默认是关闭
  Expiry: 24h										 # 签名字段的过期时间,默认 1 h
  PrivateKeys:									 # 密钥以及指纹,密钥是上面 RSA 文件位置,指纹自定义,可以多组
    - Fingerprint: "aabb"
      KeyFile: ./secret/id_rsa

第三步:
启动服务端,至此服务端的事情就干完了。

客户端签名

加一个header
客户端组装一个 header,叫做:X-Content-Security。该header 包含多个部分:

  • key
  • secret
  • signature

什么是key
第一部分是 key,key 就是前面服务端配置的Fingerprint,原样写一下。

key=aabb

什么是secret
第二部分是 secret,secret 的意义是签名,避免被篡改,这里有type,取值范围为 0 或者 1,如果不了解,那就写 0。还有对key做base64转化的部分,最后的部分是 timestamp,举个例子type=0,key=aabb,时间戳是1702283986,那么待加密的字符串是如下:

type=0;key=YWFiYg==;time=1702283986

次序无所谓,对上面的字符串用公钥加密,公钥哪里来?就是上面生成的公私钥。公钥加密后应该会得到如下字符串:

HlevieWAA4tyfz9d7DJgX7rQq/9GCOx65bdpeANqxIKZkAPCj0i1jbIhlagJlm/11P3peqLDJe5X3pl+a15jLA==

第三部分是对请求的内容进行加密,举例,我的请求是:

curl --location ‘localhost:8888/sign/demo’ --data ‘{“msg”:“111”}’ -X POST

什么是signature
signature的加密签名如下:timestamp+method+path+query+sha256(body),每个参数之间用’\n’换行符分割,举例说明,这里timestamp=1702283986, method是POST,path是/sign/demo,query是空的

1702283986\nPOST\n/sign/demo\n\n2fa4e16a8581b6042567516d23d9df8274082712f05c56fff2f736e3e17d514f

最后那串是{“msg”:“111”}经过 sha256散列而来的。对上面的字符串做一个macbase64的对称加密,加密使用的key 还是上面的 aabb,也就是服务端配置的Fingerprint,得到如下:

MLnSCu6fo6X9kV/er/NbGfJKF/80By0geR/Qx/7y4hE=

至此得到了所有需要的参数,也就得到了最后的heder

key=aabb;secret=HlevieWAA4tyfz9d7DJgX7rQq/9GCOx65bdpeANqxIKZkAPCj0i1jbIhlagJlm/11P3peqLDJe5X3pl+a15jLA==;signature=MLnSCu6fo6X9kV/er/NbGfJKF/80By0geR/Qx/7y4hE=

得到这个 header 你还是无法请求成功,因为这个时间戳应该已经过期了,配置写着签名过期时间是 24 小时,所以把时间戳换了自己重新计算吧。

一些扩展

  • PrivateKeys是数组,这说明可以配置多套指纹和 rsa文件,这适合单服务多套加密的场景。
  • type 字段取值可以为 1,,1 的话是代表客户端对 body 做了加密处理,处理的方式是:先用 AES-ecb加密,key依然是上面配置的Fingerprint, 然后做base64转化,具体操作看源码,因为没有文档。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
go-zero是一个开源的Go语言框架,它在构建微服务和高并发应用方面具有突破性的优势。其中一个突出的特点就是它整合了masterminds/squirrel,从而实现了优雅的多数据库支持。 masterminds/squirrel是一个流行的SQL查询构建器,它以非常直观和灵活的方式提供了编写SQL查询的功能。而go-zero在此基础上做了进一步的封装和优化,使得使用者能够更加方便地编写和执行SQL查询。 首先,go-zero提供了一组简洁而强大的API,使得构建SQL查询非常容易。开发者只需要按照一定的约定来创建查询参数和条件,然后使用go-zero提供的API来构建查询语句,即可完成复杂的SQL查询。 其次,go-zero还增加了一些高级功能,进一步提升了多数据库查询的灵活性和性能。例如,它支持数据库连接池管理,可以动态调整数据库连接数以适应并发请求;还支持分表分库功能,可以按照一定的规则将数据分散存储在不同的数据库或表中,从而提高查询效率。 最重要的是,go-zero通过内置的代码生成工具,提供了自动化生成数据库访问代码的能力。开发者只需要定义数据表的结构,然后运行代码生成工具,就能够自动生成包含增删改查等一系列数据库操作的代码。这极大地提高了开发效率,减少了出错的机会。 综上所述,go-zero整合了masterminds/squirrel,通过提供简洁强大的API、高级功能和自动化代码生成工具,实现了优雅的多数据库支持。它在微服务和高并发应用场景下的表现突出,为开发者提供了极大的便利和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值