在短URL令牌中编码两个值

本文关键字:两个 URL 令牌 编码 在短 | 更新日期: 2023-09-27 18:27:38

我正在开发一个短URL应用程序,其中令牌必须标识两个值:链接ID和用户ID。理想情况下,该令牌应该是短的。

例如,考虑URLhttp://sho.rt/15qq6,令牌"15qq6"必须识别链接和用户ID。

我想有一种选择是在表中插入这两个值,并使用自动生成的ID作为令牌,但我宁愿不这样做。我更喜欢涉及加密的解决方案。

如果可能的话,我怎么能将.NET加密类用于这种目的呢?非常感谢你的帮助。

在短URL令牌中编码两个值

我不清楚您想要的代码有多短。我在网上发布了一些代码来加密任意数量的查询参数。

可以通过对结果进行base64编码来缩短结果。不过,这对你来说可能还不够短。(注意,我没有对它进行base64编码,因为我担心base64编码是区分大小写的。)

另一种方法是生成一个代码,该代码由数据库中的ID和某种校验和组成。如果用户尝试修改ID,您可能会检测到这种情况。然而,这种方法可能并不那么安全,因为它可能不难找到如何创建自己的校验和。

简短的回答是"你不能",至少不容易。

加密通常不会改变加密数据的长度。因此,如果您获取要编码的URL和UserId并对其进行加密,您最终会得到一个总长度相同的令牌。

您可以尝试在加密之前压缩数据,但单个URL中没有太多冗余,这不会给您带来太多好处。

你可以对数据进行哈希处理,以获得更短的结果,但没有办法逆转这个过程来取回你的URL和userId。

如果你需要一个短令牌,那么我能想到的唯一真正的选择就是在服务器上使用令牌作为密钥的查找表。

我不认为您完全理解加密是如何工作的。

加密只是一种在不知道原始加密密钥的情况下难以解码响应的技术。

加密后的数据即使不是更大,也至少与原始数据一样长。没有可行的方法将URL编码成较小的数据量,这在URL中仍然有效。

为此使用数据库,这就是它们的用途。

编辑:哦,安德鲁在编辑后以更好的回应击败了我。

您可以使用类似RNGCryptoServiceProvider的东西来生成一组唯一的字符。使用一些常量字符串,其中包含一系列字符,如"a"到"z"、"a"到"z"以及"1"到"9"。将大小写随机混合的字母数字字符串与原始URL和UserID一起保存。

生成随机令牌,并将该令牌的链接和用户id保存在数据库中。这就足够安全了。

如果您不需要加密,那么Convert.ToBase64String和BitConverter.GetBytes的简单组合将为您提供合理的字符串。请注意,Base64使用了一些非url的字符,因此可以考虑在结果WikiPedia Base64中替换它们,或者使用Base32编码。

int first =1234;
int second =789;
var encoded = Convert.ToBase64String(
        BitConverter.GetBytes (((ulong)first<<32)+(ulong)second));