使用Hashids来保护你的Dotnet应用程序

Hashids 是一个用于生成类似 YouTube 视频 ID 的短字符串的 .NET 包。它将数字如 347 转换为字符串如 yr8,或数字数组如 [27, 986] 转换为 3kTMd。你也可以将这些 ID 解码回原始数字。这在将多个参数捆绑在一起、隐藏实际 ID 或仅使用它们作为短字符串 ID 方面非常有用。

特点

  • • 从整数创建短的、唯一的 ID。《(仅限正数和零)》

  • • 生成非顺序 ID,以保持输入递增时的不可猜测性。

  • • 支持单个数字或数字数组。《(支持 int 和 long)》

  • • 支持自定义字母表和盐 — 因此 ID 对你的应用程序是唯一的。《(盐必须小于字母表)》

  • • 支持最小哈希长度。

  • • 尽量避开基本的英语粗话。

注意事项

  • • 这不是真正的加密哈希,因为它是可逆的。

  • • 仅支持零和正整数。负数将不会被编码。

  • • 只能指定最小哈希长度。没有办法在最大哈希长度内适应任意数字。

  • • 字母表必须包含至少 16 个独特的字符,并且是区分大小写的。

  • • 分隔符是用于在哈希中编码多个数字的字符,也必须在字母表中。

  • • 盐必须小于可用字母表,并且限于 alphabet - separators - 1 的长度。

安装

使用 [NuGet][] 安装包

Install-Package hashids.net

使用

导入命名空间

using HashidsNet;
对一个数字进行编码

你可以传递一个独特的盐值,以便你的哈希与其他人的不同。我使用 "this is my salt" 作为示例。

var hashids = new Hashids("this is my salt");
var hash = hashids.Encode(12345);

hash 现在是:

NkK9

如果你的 ID 存储为 Int64,你需要使用 "EncodeLong"。

var hashids = new Hashids("this is my salt");
var hash = hashids.EncodeLong(666555444333222L);

hash 现在是:

KVO9yy1oO5j
解码

注意在解码期间,使用相同的盐值:

var hashids = new Hashids("this is my salt");
numbers = hashids.Decode("NkK9");

numbers 现在是:

[ 12345 ]
var hashids = new Hashids("this is my salt");
numbers = hashids.DecodeLong("KVO9yy1oO5j");

numbers 现在是:

[ 666555444333222L ]
解码单个 ID

默认情况下,Decode 和 DecodeLong 将返回一个数组。如果你需要解码单个 ID,你可以使用以下辅助函数:

var hashids = new Hashids("this is my pepper");
number = hashids.DecodeSingle("NkK9");

number 现在是:

12345
var hashids = new Hashids("this is my pepper");

if (hashids.TryDecodeSingle("NkK9", out int number)) { // 解码哈希成功。 }

number 现在是:

12345

你可以处理异常以查看解码出了什么问题:

var hashids = new Hashids("this is my pepper");
try
{
    number = hashids.DecodeSingle("NkK9");
}
catch (NoResultException) { // 解码提供的哈希没有产生任何结果。 }

number 现在是:

12345
var hashids = new Hashids("this is my pepper");
number = hashids.DecodeSingleLong("KVO9yy1oO5j");

number 现在是:

666555444333222L
var hashids = new Hashids("this is my pepper");

if (hashids.TryDecodeSingleLong("NkK9", out long number)) { // 解码哈希成功。 }

number 现在是:

666555444333222L
var hashids = new Hashids("this is my pepper");
try
{
    number = hashids.DecodeSingleLong("KVO9yy1oO5j");
}
catch (NoResultException) { // 解码提供的哈希没有产生任何结果。 }

number 现在是:

666555444333222L
使用不同盐解码

如果盐变了,解码将无法工作:

var hashids = new Hashids("this is my pepper");
numbers = hashids.Decode("NkK9");

numbers 现在是:

[]
编码多个数字
var hashids = new Hashids("this is my salt");
var hash = hashids.Encode(683, 94108, 123, 5);

hash 现在是:

aBMswoO2UB3Sj
解码以相同的方式完成
var hashids = new Hashids("this is my salt");
var numbers = hashids.Decode("aBMswoO2UB3Sj")

numbers 现在是:

[ 683, 94108, 123, 5 ]
编码并指定最小哈希长度

这里我们对整数 1 进行编码,并设置最小哈希长度为 8(默认为 0 -- 这意味着哈希将是尽可能短的长度)。

var hashids = new Hashids("this is my salt", 8);
var hash = hashids.Encode(1);

hash 现在是:

gB0NV05e
解码
var hashids = new Hashids("this is my salt", 8);
var numbers = hashids.Decode("gB0NV05e");

numbers 现在是:

[ 1 ]
指定自定义哈希字母表

这里我们将字母表设置为由:"abcdefghijkABCDEFGHIJK12345" 组成

var hashids = new Hashids("this is my salt", 0, "abcdefghijkABCDEFGHIJK12345")
var hash = hashids.Encode(1, 2, 3, 4, 5)

hash 现在是:

Ec4iEHeF3

随机性

hashids 的主要用途是混淆 ID。它不是为安全目的或压缩而设计或测试的。话虽如此,这个算法确实试图使这些哈希不可猜测和不可预测:

重复数字
var hashids = new Hashids("this is my salt");
var hash = hashids.Encode(5, 5, 5, 5);

你在哈希中看不到任何重复的模式,可能显示有 4 个相同的数字:

1Wc8cwcE

同样适用于递增数字:

var hashids = new Hashids("this is my salt");
var hash = hashids.Encode(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

hash 将是:

kRHnurhptKcjIDTWC3sx
递增数字哈希:
var hashids = new Hashids("this is my salt");

hashids.Encode(1); // => NV
hashids.Encode(2); // => 6m
hashids.Encode(3); // => yD
hashids.Encode(4); // => 2l
hashids.Encode(5); // => rD
使用 HEX 字符串编码
var hashids = new Hashids("this is my salt");
var hash = hashids.EncodeHex("DEADBEEF");

hash 现在是:

kRNrpKlJ
解码为 HEX 字符串
var hashids = new Hashids("this is my salt");
var hex = hashids.DecodeHex("kRNrpKlJ");

hex 现在是:

DEADBEEF

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值