前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >对 int 类型的数据加密,有哪些好的方案?

对 int 类型的数据加密,有哪些好的方案?

作者头像
新亮
发布2020-04-02 17:48:15
1.2K0
发布2020-04-02 17:48:15
举报
文章被收录于专栏:新亮笔记

问题

为什么要对 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"

代码语言:javascript
复制
// 加密
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{}
}

小结

一个小问题的解决方案,供大家参考

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 新亮笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题
  • 分析
  • 解决方案
  • Go 代码分享
  • 小结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档