C# 如何在C中加密/解密url#

C# 如何在C中加密/解密url#,c#,asp.net,url-rewriting,C#,Asp.net,Url Rewriting,我有一个URL www.site-address/site-page/page1.aspx?username=deepu&password=deepu 如何将URL更改为 www.site-address/site page/page1.aspx?用户名=232322323232和密码=232322323 ie我想加密通过URL传递的字段请帮助我使用.net在C#中加密和解密URL,现在我使用response.redirect并将这些值作为查询字符串传递…请帮助…您的方法有缺陷,加密不会真正帮助

我有一个URL www.site-address/site-page/page1.aspx?username=deepu&password=deepu 如何将URL更改为 www.site-address/site page/page1.aspx?用户名=232322323232和密码=232322323
ie我想加密通过URL传递的字段请帮助我使用.net在C#中加密和解密URL,现在我使用response.redirect并将这些值作为查询字符串传递…请帮助…

您的方法有缺陷,加密不会真正帮助根本问题。如果你穿越网络,你将很少(不应该)看到你所描述的模式,即使它是加密的

相反,您应该在服务器上尽可能安全地存储用户凭据,并在querystring中传递一个唯一的、短期的会话令牌,您可以使用它来查找凭据

至于在服务器上安全地存储,一旦您第一次收到用户密码,就应该使用单向散列(如SHA256)和salt。您可以将此值传递到任何位置,存储它,并将潜在密码的has与存储的哈希进行比较以进行验证。将用户密码视为有毒废物——尽快扔掉。你想从事密码存储业务,就像你想从事有毒废物存储业务一样


(在我的iPhone上回答,链接即将发布,或者如果有人想帮我的话!:)

你真的想这样做吗?如果您为用户名和密码而烦恼,那么您提供的信息或功能可能会有一些价值。通过URL参数传递,您会留下大量的攻击面(尤其是重播任何人都可以模拟您的用户的攻击)


你到底想做什么,为什么不能使用?

为什么不发布值,而不是使用查询字符串?使用SSL,至少没有人会看到密码被加密或其他方式。URL中的其他密码不提供任何安全性。这就像把钥匙分散到你家附近的每个角落,并希望没有人能看到密码被加密或其他方式我试着让他们帮你开门

基本上,这是一个有缺陷的前提。URL以多种方式缓存,所以不在其中放置密码是有意义的

然而,在URL中输入密码的并不是你一个人。请检查这个


它不会以您想要的方式工作,但是可以通过下面提到的方式进行加密

加密页面:

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;
        }
}
解密页面:

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;
        }
}

呼吸……标点符号是你的朋友。我也想知道。不是我会这样做,而是“会话”到底是如何工作的?作为一个用户,如果你觉得在URL中看到你的用户名和密码很舒服的话,请举手?甚至应该是“加密的”有人吗?可能是被骗了,谢谢你的回答,,,我需要将一些数据传递到另一个页面..如果我通过url传递,我不想让客户端看到文件值..任何加密表单都是可能的..我不是说我想要这个表单…@deepu答案是“不要那样做”。这是非常危险的。好的。那么我如何才能将一些值传递到另一个页面…而不是服务器。传输方法..@deepu,正如我在回答中所说的-将凭据信息存储在数据库、会话或服务器上的某个其他位置,并通过查询字符串传递令牌ID-在目标页面上使用令牌进行查看再次上传信息。+1表示“你想从事密码存储业务,就像你想从事有毒废物存储业务一样。”我同意。将凭证存储在查询字符串中是一种非常糟糕的形式,即使它是加密的。有人截取查询字符串并模拟用户是非常容易的。yh…我需要将一些数据传递到另一个页面。如果我通过url传递,我不希望客户端看到字段值。这就是我所想的不要加密值和传递是可能的…任何简单的方法都可以…您不必传递用户名/密码!听说过会话吗?如果您只看MSFT建议的内容,这将自动为您处理。请务必查看标准ASP.NET身份验证机制,我敦促您!我正在寻找类似的问题,并遇到您的问题代码。它工作得非常好,但是
加密
方法生成的字符在添加到URL时会被替换为空格(例如
+
)。因此,
Decrypt
方法将不会像我预期的那样工作。有什么解决方法吗?是的,当您必须将密码从一个页面发送到另一个页面时,当然应该使用post方法,它可以用于基于查询字符串在页面中使用某些值的情况。