Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在短URL标记中编码两个值_C#_.net_Encryption - Fatal编程技术网

C# 在短URL标记中编码两个值

C# 在短URL标记中编码两个值,c#,.net,encryption,C#,.net,Encryption,我正在开发一个短URL应用程序,其中令牌必须标识两个值:链接ID和用户ID。理想情况下,该令牌应该是短的 例如,考虑到URL,令牌“15qq6”必须标识链接和用户ID 我想一种选择是在表中插入这两个值,并使用自动生成的ID作为标记,但我不希望这样。我更喜欢涉及加密的解决方案 如果可能的话,我如何使用.NET加密类实现这种目的?非常感谢你的帮助。简短的回答是“你不能”,至少不容易 加密通常不会更改被加密数据的长度。因此,如果您获取要编码和加密的URL和用户ID,您将得到一个总长度相同的令牌 您可以

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

例如,考虑到URL,令牌“15qq6”必须标识链接和用户ID

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

如果可能的话,我如何使用.NET加密类实现这种目的?非常感谢你的帮助。

简短的回答是“你不能”,至少不容易

加密通常不会更改被加密数据的长度。因此,如果您获取要编码和加密的URL和用户ID,您将得到一个总长度相同的令牌

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

您可以对数据进行哈希运算以获得较短的结果,但无法逆转此过程以恢复URL和用户ID


如果它是您需要的短令牌,那么我能想到的唯一实际选项是服务器上的一个查找表,使用令牌作为密钥。

生成随机令牌,并将此令牌的链接和用户id保存在db中。它的安全性已经足够了。

我认为您并不完全了解加密的工作原理

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

加密数据至少与原始数据一样长(如果不是更大的话)。 没有可行的方法将URL编码为少量数据,这在URL中仍然有效

使用一个数据库,这就是他们的目的


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

我不清楚您想要的代码有多短。我在网上发布了一些代码

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


另一种方法是编写一个代码,该代码由数据库中的ID和某种校验和组成。如果用户尝试修改ID,您可能会检测到这一点。但是,这种方法可能不太安全,因为弄清楚如何创建自己的校验和可能并不困难。

您可以使用类似的方法来生成一组独特的字符。使用一些常量字符串,其中包含一系列字符,如“a”到“z”、“a”到“z”以及“1”到“9”。将随机混合大小写的字母数字字符串与原始URL和用户ID一起保存。

如果您不需要加密,那么简单的组合和将为您提供合理的字符串。注意,Base64使用一些非URL CANNRACTER,因此考虑在结果中替换它们,或者使用Base32编码。
int first =1234;
int second =789;
var encoded = Convert.ToBase64String(
        BitConverter.GetBytes (((ulong)first<<32)+(ulong)second));
int first=1234;
整数秒=789;
var encoded=Convert.ToBase64String(

BitConverter.GetBytes(((ulong)首先,你的用户id和链接id有多长?如果你使用加密,你肯定会得到一个比你想要的长得多的字符串,它们都是整数。我想如果令牌不太短也没关系。谢谢!你怎么知道它是否足够安全?也许他在你的银行工作,并使用这些URL让你快速访问你的帐户您的支票帐户。随机令牌不包含任何信息,并且随机令牌不会被提取。为了更好的安全性,可以使用crypto Random.+1。您的示例应该足以了解如何使用加密。对于返回Url,我将使用base32编码(Url安全且忽略字母大小写更改)或者至少修改了只使用Url安全字符的base64。@Alexei:是的,base32可能是一个不错的折衷方案。