ASP.NET C# 透过URL加密解密传输数据
ASP.NET C# 通过URL加密解密传输数据
这里注意在解密的时候要把其中的空格用加号替换。
这里为了安全考虑,增加了s_key字符串,其为随机生成的字符串,并预先将其和userName存入数据库。
需求
使用HTML模板发送邮件,邮件中含有一个链接,点击链接打开浏览器,完成相应功能。
分析
链接使用http://www.******.com?id=123456&name=Nicholas这种URL后面加连接字符串的形式。
问题
问号后面的字符串是明文,不能传输一些敏感数据,并且容易遭到篡改。
解决方法
将问号后面的字符串加密,需要的时候再解密。
使用html模板发送电子邮件在上篇博文《asp.net使用html模板发送电子邮件》已有介绍。
加密解密模块
public static class Decryption { private static byte[] key = { 0x21, 0x43, 0x65, 0x87, 0x09, 0xBA, 0xDC, 0xFE }; private static byte[] IV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF }; /// <summary> /// 加密处理 /// </summary> /// <param name="Input"></param> /// <returns></returns> public static string Encrypt(string Input) { try { DESCryptoServiceProvider des = new DESCryptoServiceProvider(); Byte[] inputByteArray = Encoding.UTF8.GetBytes(Input); MemoryStream ms = new MemoryStream(); CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(key, IV), CryptoStreamMode.Write); cs.Write(inputByteArray, 0, inputByteArray.Length); cs.FlushFinalBlock(); return Convert.ToBase64String(ms.ToArray()); } catch (Exception ex) { return ""; } } /// <summary> /// 解密处理 /// </summary> /// <param name="Input"></param> /// <returns></returns> public static string Decrypt(string Input) { if (!string.IsNullOrEmpty(Input)) { Input = Input.Replace(" ", "+"); Byte[] inputByteArray = new Byte[Input.Length]; try { DESCryptoServiceProvider des = new DESCryptoServiceProvider(); inputByteArray = Convert.FromBase64String(Input); MemoryStream ms = new MemoryStream(); CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(key, IV), CryptoStreamMode.Write); cs.Write(inputByteArray, 0, inputByteArray.Length); cs.FlushFinalBlock(); Encoding encoding = Encoding.UTF8; return encoding.GetString(ms.ToArray()); } catch (Exception ex) { return ""; } } else { return ""; } } }
这里注意在解密的时候要把其中的空格用加号替换。
加密
/// <summary> /// 替换email中的字符串 /// </summary> /// <returns></returns> public static String getEmailStr(string url,string userName, string s_key) { //s_key为随机生成的字符串 String str = userName+ "," +s_key; return "<a href=\"" + url + "?" + Decryption.Encrypt(str) + "\"></a>"; }
这里为了安全考虑,增加了s_key字符串,其为随机生成的字符串,并预先将其和userName存入数据库。
解密
try { param = Request.Url.Query; param = param.Substring(1, param.Length - 1); } catch (Exception) { Response.Write("<script>alert(\"error\")</script>"); return; } //解密 //param="userName,s_key" param = Decryption.Decrypt(param); String[] str = param.Split(',');//逗号分隔 if (str.Length == 2) { userName=str[0]; s_key=str[1]; //检验其是否有非法字符 if (Common.RegxURL(userName) && Common.RegxURL(s_key)) { //数据库验证userName与s_key是否对应 if (Common.validateKey(userName, s_key)) { //do something } }}其中Request.Url.Query所获得的是问号及问号后面的字符串,所以解密的时候要先把问号去掉。一定不要忘了进行数据库操作之前检查所获得的参数中是否有非法字符,防止SQL注入式攻击。前段时间火车票网站12306就爆出有多处SQL注入漏洞。
THE END