我正在开发一个简短的URL应用程序,其中令牌必须标识2个值:链接ID和用户ID。理想情况下,此标记应该很短。
例如,考虑到URL http://sho.rt/15qq6,令牌“15qq6”必须标识链接和用户ID。
我想一个选项是在表中插入两个值并使用自动生成的ID作为标记,但我宁愿不这样做。我更喜欢涉及加密的解决方案。
如果可能,我如何才能将.NET加密类用于此目的?非常感谢你的帮助。
答案 0 :(得分:3)
简短回答是“你不能”,至少不容易。
加密通常不会更改加密数据的长度。因此,如果您使用要编码的URL和UserId并对其进行加密,则最终会得到一个总长度相同的令牌。
你可以尝试在加密之前压缩数据,但是在一个网址中没有很多冗余,这对你来说不会太多。
您需要对数据进行哈希处理,以便为您提供更短的结果,但是无法撤消此过程以恢复您的网址和用户ID。
如果它是一个短令牌你需要那么我能想到的唯一真正的选择是服务器上的查找表,使用令牌作为密钥。
答案 1 :(得分:3)
我认为您并不确切了解加密的工作原理。
加密只是一种在不知道原始加密密钥的情况下难以解码响应的技术。
加密数据至少与原始数据一样长,如果不是更大的话。 没有可行的方法将URL编码为较少量的数据,这在URL中仍然有效。
为此使用数据库,这就是他们的目的。
编辑:噢,安德鲁在编辑后以更好的反应击败了我。
答案 2 :(得分:3)
我不清楚你想要你的代码有多短。我在网上发布了一些代码to encrypt any number of query arguments。
结果可以通过base64编码来缩短结果。尽管如此,这可能还不够短。 (请注意,我没有对其进行base64编码,因为我对base64编码有一些担忧是区分大小写的。)
另一种方法是提出一个代码,该代码由数据库中的ID和某种校验和组成。如果用户尝试修改ID,您可以检测到这一点。但是,这种方法可能不那么安全,因为要弄清楚如何创建自己的校验和可能并不难。
答案 3 :(得分:2)
您可以使用RNGCryptoServiceProvider之类的内容生成一组唯一的字符。使用一些常量字符串,其中包含一系列字符,如“a”到“z”,“A”到“Z”和“1”到“9”。使用原始URL和UserID保存随机混合的大小写字母数字字符串。
答案 4 :(得分:1)
生成随机令牌并在db中为此令牌保存链接和用户ID。这足够安全。
答案 5 :(得分:1)
如果您不需要加密,那么Convert.ToBase64String和BitConverter.GetBytes的简单组合将为您提供合理的字符串。请注意,Base64使用一些非url cahnracters,因此请考虑在结果WikiPedia Base64中替换它们,或使用Base32编码。
int first =1234;
int second =789;
var encoded = Convert.ToBase64String(
BitConverter.GetBytes (((ulong)first<<32)+(ulong)second));