我正在使用以下加密技术来加密MVC应用程序中的查询字符串值。
所以网址会像controller/details/rlSRlRZwzbU%3d
但是当param = 2
和KEY = mcbgp23njwmcinu0tij05vc2
时,此函数会返回UhMZc7/MNK8=
。
因此格式化的网址将为controller/details/UhMZc7/MNK8%3d
并提供404 Error
public static string Encrypt(string dataStr)
{
Byte[] inputByteArray = Encoding.ASCII.GetBytes(dataStr);
var mstr = new MemoryStream();
string KEY = HttpContext.Current.Session.SessionID;
var key = Encoding.ASCII.GetBytes(KEY.Substring(0, 8));
var des = new DESCryptoServiceProvider();
var cstr = new CryptoStream(mstr, des.CreateEncryptor(key, key), CryptoStreamMode.Write);
cstr.Write(inputByteArray, 0, inputByteArray.Length);
cstr.FlushFinalBlock();
return Convert.ToBase64String(ms.ToArray());
}
如何使此功能成为MVC URL的安全?有没有其他好的技术来生成url-safe加密格式?
编辑:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}
答案 0 :(得分:2)
问题是Base64编码使用/和+字符,这些字符是URL中的特殊字符。解决此问题的典型方法是使用修改后的Base64编码,将/
转换为_
和' +'到' - '。这被称为" base64url"编码。请参阅维基百科文章中的variants summary table。
您可以使用两种简单方法完成此操作:
static string ToBase64Url(string base64)
{
return base64.Replace("/", "_").Replace("+", "-");
}
static string FromBase64Url(string base64Url)
{
return base64Url.Replace("_", "/").Replace("-", "+");
}
在您的代码中,您将替换此行:
return Convert.ToBase64String(ms.ToArray());
使用:
return ToBase64Url(Convert.ToBase64String(ms.ToArray()));
当然,您必须在另一端正确解码它:从Base64Url转换为标准Base64,然后将其转换为字节数组。