Cas*_*ton 3 c# encryption asp.net-mvc url-encoding
我在网上寻找一个简单的小加密方法,它会接受一个字符串,加密它,然后解密它.我的想法是,我需要一个不能在计划文本中的URL.
我发现的课程大部分时间都很有用,但有时候,我最终会得到一个带有/的加密字符串:
OSprnGR/0os4DQpQsa0gIg==
Run Code Online (Sandbox Code Playgroud)
可以想象,这在URL中使用时会导致问题.所以我认为,如果我只是UrlEncode字符串,它将解决问题.
它没有.
即使URL看起来像这样,我仍然会得到相同的错误:
http://localhost:54471/BrokerDashboard/BuyingLeads/LeadView/OSprnGR%2f0os4DQpQsa0gIg%3d%3d
Run Code Online (Sandbox Code Playgroud)
而不是这个:
http://localhost:54471/BrokerDashboard/BuyingLeads/LeadView/OSprnGR/0os4DQpQsa0gIg==
Run Code Online (Sandbox Code Playgroud)
HTTP错误404.0 - 未找到您要查找的资源已被删除,名称已更改或暂时不可用.
这是我正在使用的课程:
public static class Encryption
{
public static string keyString { get { return "6C3A231C-57B2-4BA0-AFD6-306098234B11"; } }
private static byte[] salt = Encoding.ASCII.GetBytes("somerandomstuff");
public static string Encrypt(string plainText)
{
Rfc2898DeriveBytes key = new Rfc2898DeriveBytes(keyString, salt);
MemoryStream ms = new MemoryStream();
StreamWriter sw = new StreamWriter(new CryptoStream(ms, new RijndaelManaged().CreateEncryptor(key.GetBytes(32), key.GetBytes(16)), CryptoStreamMode.Write));
sw.Write(plainText);
sw.Close();
ms.Close();
string beforeUrlEncoded = Convert.ToBase64String(ms.ToArray());
string afterUrlEndcoded = HttpUtility.UrlEncode(beforeUrlEncoded);
return afterUrlEndcoded;
}
public static string Decrypt(string encrypted)
{
//string urlDecoded = HttpUtility.UrlDecode(encrypted); // <--- Turns out you don't need this
Rfc2898DeriveBytes key = new Rfc2898DeriveBytes(keyString, salt);
ICryptoTransform d = new RijndaelManaged().CreateDecryptor(key.GetBytes(32), key.GetBytes(16));
byte[] bytes = Convert.FromBase64String(encrypted);
return new StreamReader(new CryptoStream(new MemoryStream(bytes), d, CryptoStreamMode.Read)).ReadToEnd();
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:
这是路线:
routes.MapRoute(
name: "BrokerLead",
url: "BrokerDashboard/BuyingLeads/LeadView/{id}"
);
Run Code Online (Sandbox Code Playgroud)
该/
字符是保留的,不能在路径部分中使用.如果这是您网址的最后一段,您可以使用以下路由使其工作(请注意该{*id}
段):
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{*id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
Run Code Online (Sandbox Code Playgroud)
另一种方法是在加密/解密时用其他方法替换这个字符,但一般来说,你应该避免网址路径部分中的特殊字符,只需将它们作为查询字符串,你可以正确地对所有内容进行编码.