2010-06-03 249 views
3

我有一个URL www.site地址/站点页/ page1.aspx这个?用户名=迪普&密码=迪普 我怎样才能将URL更改为 www.site-网址地址/网站页面/ page1.aspx这个?用户名= 232322323232 &密码= 2323232322323 即我想要加密我通过URL字段请帮我加密和使用.NET解密在C#中的URL,我现在用的响应.redirect并通过这些值作为查询字符串....请帮助....如何加密/解密C#

+9

呼吸....标点符号是你的朋友。 – 2010-06-03 13:16:47

+0

我也想知道。不是说我会这样做,但“会话”究竟是如何工作的? – 2010-06-03 13:18:24

+3

如果作为一个用户,您可以在URL中看到您的用户名和密码,感觉很舒服,请举手?甚至被认为是“加密的?”任何人? – 2010-06-03 13:19:25

回答

5

你的方法是有缺陷的加密不会真正帮助潜在的问题。如果你穿过网络出去,你很少(永远也不会)看到你所描述的模式,即使它是加密的。

相反,你应该存储用户凭据尽可能安全的服务器上,并可以用它来查找凭证的查询字符串传递一个独特的,短暂的会话令牌。

用于安全地存储在服务器上,一旦你收到用户的密码是第一次,你应该使用一个单向散列,像SHA256,与盐。你可以在任何地方传递这个值,存储它并验证,比较你存储的哈希值是否有潜在的密码。像使用有毒废物一样处理用户的密码 - 尽快将其扔掉。您希望在密码存储业务方面与您想要进行有毒废物存储业务一样糟糕。

(从我的iPhone回答,链接或即将出台,如果有人愿意帮助我!:))

+0

谢谢你回答,,,我需要将一些数据传递给另一个页面..如果我通过url传递,我不希望客户端看到字段值..任何加密的形式都是可能的..我并不是说我想要这种形式... – deepu 2010-06-03 13:26:34

+1

@deepu答案是“不要那样做”。这是非常危险的。 – 2010-06-03 13:29:58

+0

okz..then如何将一些值传递给另一个页面...除了server.transfer方法.. – deepu 2010-06-03 13:36:10

4

你真的想这样做吗?如果您打算使用用户名和密码,推测可能会对您提供的信息或功能有所帮助。随着URL参数传递,你留个号码的攻击面敞开(未至少重播攻击,任何人都可以冒充你的用户。

什么是你真正想要做的,为什么你不能使用what's provided in ASP.NET

+0

我同意。将凭证存储在查询字符串中是非常糟糕的形式,即使它是加密的。对于截取查询字符串并冒充用户来说很容易。 – 2010-06-03 13:30:59

+0

嗯......我需要传递一些数据到另一个页面..如果我通过网址传递,我不希望客户端看到提交的值..thatz所有我认为abt加密值和传递是可能的。 ..有一个简单的方法... – deepu 2010-06-03 13:32:39

+1

你不必一起传递用户名/密码!听说会议?如果你只是看看MSFT推荐的内容,这会自动处理。请看看标准的ASP.NET身份验证机制,我敦促你! – 2010-06-03 14:23:04

1

为什么不发布值而不是使用查询字符串?使用SSL至少没有人会看到密码被加密或以其他方式。URL中的其他密码不提供任何安全性。附近,希望没有人会尝试他们打开你的房子。

基本上它是一个有缺陷的前提。网址是多方面缓存,因此它是有道理的,不要把passwo在他们的rds。

然而,你不是一个人在把密码的URL。检查了这一点

http://support.microsoft.com/kb/135975

+0

是的,当你必须从一个页面发送密码到另一个页面时,你应该使用post方法,当你在基于查询字符串的页面中使用一些值时,可以使用它。 – 2014-05-02 06:46:12

7

它不会在你所希望的方式工作,但肯定的加密是可能的,通过下文提到的方式

加密页面:

string id1 = "id1"; 

Response.Redirect("decryptionPage.aspx?id1=" + HttpUtility.UrlEncode(Encrypt(id1))); 

private string Encrypt(string stringToEncrypt) 
{ 
     byte[] inputByteArray = Encoding.UTF8.GetBytes(stringToEncrypt); 
     byte[] rgbIV = { 0x21, 0x43, 0x56, 0x87, 0x10, 0xfd, 0xea, 0x1c }; 
     byte[] key = { }; 
     try 
     { 
      key = System.Text.Encoding.UTF8.GetBytes("A0D1nX0Q"); 
      DESCryptoServiceProvider des = new DESCryptoServiceProvider(); 
      MemoryStream ms = new MemoryStream(); 
      CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(key, rgbIV), CryptoStreamMode.Write); 
      cs.Write(inputByteArray, 0, inputByteArray.Length); 
      cs.FlushFinalBlock(); 
      return Convert.ToBase64String(ms.ToArray()); 
     } 
     catch (Exception e) 
     { 
      return e.Message; 
     } 
} 

解密页面:

string getId1 = Convert.ToString(Request.QueryString["id1"]); 
var qs = Decrypt(HttpUtility.UrlDecode(getId1)); 
private string Decrypt(string EncryptedText) 
{ 
     byte[] inputByteArray = new byte[EncryptedText.Length + 1]; 
     byte[] rgbIV = { 0x21, 0x43, 0x56, 0x87, 0x10, 0xfd, 0xea, 0x1c }; 
     byte[] key = { }; 

     try 
     { 
      key = System.Text.Encoding.UTF8.GetBytes("A0D1nX0Q"); 
      DESCryptoServiceProvider des = new DESCryptoServiceProvider(); 
      inputByteArray = Convert.FromBase64String(EncryptedText); 
      MemoryStream ms = new MemoryStream(); 
      CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(key, rgbIV), CryptoStreamMode.Write); 
      cs.Write(inputByteArray, 0, inputByteArray.Length); 
      cs.FlushFinalBlock(); 
      System.Text.Encoding encoding = System.Text.Encoding.UTF8; 
      return encoding.GetString(ms.ToArray()); 
     } 
     catch (Exception e) 
     { 
      return e.Message; 
     } 
} 
+0

我正在寻找一个类似的问题,并遇到您的代码。它的工作原理完全正确,但“Encrypt”方法生成的字符在添加到URL时会被空格替换(例如'+')。所以,'Decrypt'方法不会像我所期望的那样工作。任何想法来解决它? – Yalda 2013-09-22 06:34:23

+0

它工作得很好。 – Monika 2013-12-10 07:53:08