问题
为什么要对 int 类型的数据加密,它的应用场景是什么?
比如:有一个商品详情界面 URL 为 /product/1001
,这种情况很容易被别人猜测,比如输入 /product/1002
、/product/1003
尝试着去查看详情,这样的话信息就暴露了,如果别人想抓数据的话,只需要将后面的 ID 递增抓取就可以了,怎么解决这个问题?
比如:有一个用户邀请码需求,用户可以将自己的邀请码分享出去,当新用户使用这个邀请码注册的时候,就会给邀请者和被邀请者双方发奖励,通过 URL /user/1001
注册的,表示用户ID为 1001 的邀请的,这样用户ID很容易被修改,怎么解决这个问题?
分析
上面的两个场景都是需要对 int 类型的数据进行加密,避免 ID 泄露。
需要满足以下特性:
支持自定义 salt,保证加密后的是独一无二。
支持加密和解密。
支持多语言。
解决方案
推荐一个开源的类库。
官网地址:https://hashids.org/
支持多语言,包很小,使用也非常简单。
下面给大家分享在 Go 中使用的。
Go 代码分享
先说结果:我将 1001 加密成 1oEpdkEzWA,1002 加密成 NnlzvxEORb。
具体实现看如下代码。
首先:import "github.com/speps/go-hashids"
// 加密
func Encrypt(salt string, minLength int, params []int) string {
hd := hashids.NewData()
hd.Salt = salt
hd.MinLength = minLength
h, err := hashids.NewWithData(hd)
if err == nil {
e, err := h.Encode(params)
if err == nil {
return e
}
}
return ""
}
// 解密
func Decrypt(salt string, minLength int, hash string) []int {
hd := hashids.NewData()
hd.Salt = salt
hd.MinLength = minLength
h, err := hashids.NewWithData(hd)
if err == nil {
e, err := h.DecodeWithError(hash)
if err == nil {
return e
}
}
return []int{}
}
小结
一个小问题的解决方案,供大家参考 ~