在C#.net中加密查询字符串

4
string emailfield=txtEmail.Text.ToString();
string url = 
   "http://localhost:3076/user/Authenticate-Users.aspx?email="+emailfield;

我想加密查询字符串,然后再进行解密。在C#中有没有这样的方法?

谢谢


7
最好的解决方案是只需通过HTTPS托管服务。如果无法实现:谁将解密电子邮件地址?您想使用对称加密还是非对称加密? - Chris Wenham
你是仅基于电子邮件地址对用户进行身份验证吗?那太荒谬了。你需要在其中加入密码。另外,我已经修正了你的拼写错误。["dis" isEqualToString:@"this"] != true; - FreeAsInBeer
有一个页面,我在其中对用户进行身份验证,只有在输入有效电子邮件地址的情况下,用户才会访问此URL。在访问此URL后,针对该用户进行数据库条目记录,以表明其电子邮件地址已经过验证,但是某些人可能会直接使用URL并嵌入其电子邮件地址以进行验证,尽管我已经采取了所有防止DOS攻击的措施,但客户要求加密查询字符串,我能在C#中实现64位加密吗? - abhijit
@freeasinbeer 这只是页面的一部分,不需要登录或其他操作。我们只需要输入电子邮件地址即可。我们正在遵循以下步骤: 用户在一个页面上输入他的ID,如果电子邮件有效,他将收到一封邮件,其中包含一个激活链接。点击链接后,用户将被重定向到包含查询字符串的URL。 - abhijit
FYI,64位“加密”不比使用XOR更安全。它可以在几分钟内被破解。有人提到使用映射到电子邮件地址的GUID。这听起来像是你要找的东西。 - Bengie
显示剩余3条评论
4个回答

7
你可以将一个名称/值集合加密为一个字符串,然后只需将该加密的字符串作为单个查询参数传递。
我在一篇文章中展示了这种技术,加密查询参数

但是密钥是恒定不变的,这并不会使网页更安全。密钥需要是一个安全的随机密钥。 - Nayef
@Nayef:那是一种选择。但说它需要以那种方式完成是不正确的。 - Jonathan Wood

2

由于加密数据很可能包含特殊字符,因此必须进行base64编码或类似的编码。

您可以找到一个编码/解码类来为您完成这项工作。有许多这样的类。这里是一个例子。


Tedd是正确的。一旦您拥有一个加密值,然后想在URL中的某个位置使用它(比如查询字符串参数),您需要转换“特殊字符”,以便它们可以在URL中使用。通常这时会进行base64编码。只需搜索如何进行Base64编码即可。 - Jaans

0

可能正在寻找Server.UrlEncode

URLEncode方法将URL编码规则(包括转义字符)应用于指定的字符串。

(以防您对“加密”过于具体,否则其他人已经提供了有关保护字符串值的良好答案。)


0

一个更简单的解决方案是在创建用户帐户时存储一个GUID。例如,您可以称其为VerificationCode。当您创建用户帐户时,随机将一个GUID与之关联,例如120a9c10-4f2e-11e0-b8af-0800200c9a66。

现在,在激活链接中,您嵌入GUID而不是电子邮件地址:http://localhost:3076/user/Authenticate-Users.aspx?code=120a9c10-4f2e-11e0-b8af-0800200c9a66

当页面执行时,它通过GUID查找用户以标记帐户已被确认。


1
据我所知,GUID不是加密安全或唯一的。维基百科引用:“对WinAPI GUID生成器的密码分析表明,由于V4 GUID序列是伪随机的,因此在完全知道内部状态的情况下,可以预测前后值…” http://en.wikipedia.org/wiki/Globally_Unique_Identifier --- 因此最好使用哈希函数,如SHA-2(请参阅http://msdn.microsoft.com/en-us/library/system.security.cryptography.sha256.aspx) - Kimball Robinson
如果在数据库中使用唯一约束存储Guid,这将不是问题。 加密电子邮件的目的是什么?您可以预测后续值,但可以在HTTP POST中进行验证。 http://stackoverflow.com/a/13355076/1288063 - riadh gomri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接