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

本文探讨了对int类型数据加密的必要性,特别是在商品详情页URL和用户邀请码等场景下,以防止ID泄露和数据抓取。介绍了hashids库的使用,该库支持多语言、自定义salt和加密解密功能,有效保护敏感信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题

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

小结

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

推荐阅读

<think>好的,我现在要回答用户关于__int128数据类型的问题。首先,我需要确认用户的具体需求。他们想了解__int128的定义、使用场景、支持的语言以及用法。接下来,我需要回忆自己对这个数据类型的了解,并整理相关信息。 首先,定义部分。__int128是128位的有符号整数类型,通常用于需要处理极大整数的情况,比如大数运算或加密算法。不过,我记得这个类型并不是标准C/C++的一部分,而是由某些编译器(如GCC、Clang)提供的扩展。需要明确这一点,避免用户误解为标准支持。 然后,使用场景。常见的场景包括需要超过64位整数范围的计算,比如科学计算中的高精度模拟,密码学中的大素数生成,或者竞赛编程中的大数处理。这里需要举例说明,让用户更清楚应用的具体情况。 接下来是支持的编程语言。主要是在C和C++中,通过特定的编译器支持。需要提到具体的编译器,比如GCC和Clang,并说明可能需要在编译时开启某些选项。同时,其他语言如Rust可能有不同的实现方式,但标准库通常不支持,需要第三方库。这部分需要区分不同语言的情况,避免混淆。 关于用法,需要给出具体的代码示例,比如变量的定义、赋值、运算等。需要注意的是,__int128的输入输出可能需要自定义函数,因为标准库函数如printf和cin/cout可能不支持直接处理。这里可以举一个简单的加减乘除的例子,并强调输入输出的处理方式。 另外,用户提供的引用中有提到仓颉语言的类型检查和内存安全,这可能与问题无关,但需要注意不要混淆。引用中的其他内容如字典类型和函数类型作为变量也与当前问题无关,可以忽略。 最后,生成相关问题。需要考虑用户可能进一步想了解的内容,比如性能影响、不同编译器的差异、如何输入输出,以及替代方案等。确保问题具有针对性,帮助用户深入理解。 需要检查是否有遗漏点,比如不同平台的支持情况(如Windows的编译器是否支持),或者与其他大数处理库(如GMP)的对比。此外,是否需要提醒用户注意溢出问题,虽然128位已经很大,但仍有溢出的可能,特别是在循环或累积计算中。 总结,回答的结构应该分为定义、使用场景、支持的语言、用法示例,以及相关问题。确保每个部分简明扼要,信息准确,并引用正确的来源。同时,保持语言口语化,避免过于技术化的术语,让用户容易理解。</think>### __int128 数据类型详解 #### 1. **定义** `__int128` 是一种 **128位有符号整数类型**,可表示范围为 $-2^{127}$ 到 $2^{127}-1$。它主要用于需要处理极大整数的场景(如密码学、大数运算),但 **不属于C/C++标准**,而是由编译器(如GCC、Clang)提供的扩展[^1]。 #### 2. **使用场景** - **科学计算**:高精度数值模拟或物理建模。 - **密码学**:生成大素数或处理RSA加密中的大数运算。 - **竞赛编程**:避免因64位整数溢出导致的计算错误。 - **金融计算**:高精度货币计算或利息累加。 #### 3. **支持的编程语言** - **C/C++**:需特定编译器支持(如GCC ≥4.6、Clang ≥3.8),且通常需开启编译选项(如 `-std=gnu++11`)。 - **其他语言**(如Rust、Go):需通过第三方库(如Rust的 `num-bigint`)实现类似功能,原生不支持128位整数[^2]。 #### 4. **用法示例(C++)** ```cpp #include <iostream> // 自定义__int128输出函数 void print(__int128 x) { if (x < 0) { putchar('-'); x = -x; } if (x > 9) print(x / 10); putchar(x % 10 + '0'); } int main() { __int128 a = 123456789012345678901234567890LL; __int128 b = 2; __int128 c = a * b; // 直接进行算术运算 print(c); // 输出 246913578024691357802469135780 return 0; } ``` **注意**: - **输入/输出**需自定义函数(如上例的 `print`),因标准库函数(如 `printf`)不支持直接操作。 - **跨平台限制**:Windows的MSVC编译器通常不支持此类型。 #### 5. **与标准类型的对比** | 类型 | 位数 | 范围(有符号) | 标准支持 | |-----------|-------|-----------------------------------|----------| | `int64_t` | 64 | $-2^{63}$ 到 $2^{63}-1$ | 是 | | `__int128`| 128 | $-2^{127}$ 到 $2^{127}-1$ | 否 | --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值