url地址栏传参,如何加密呀

woodyy 2014-05-11 12:34:51
我现在做的是mvc项目,例如一个地址栏是:http://localhost:883/Third/Details/27

我如何把那个最后数值“27”个加密发送过去呢,然后那边解密接收。

目前我尝试了以下办法,分别都不合适。

一,有人说用session,或post提交。这个不行,因为页面很多都是生成的a标签点击过去的,而不是后台的转向事件。

二,有人说用Server.UrlEncode,可是很遗憾,这个对数值无效。

三,最终我想到用对称加密方式,也是我一直在用的DESCryptoServiceProvider这个,可惜这个有一些数值,竟然生成了
类似这样的字符,例如“http://localhost:883/Third/Details/7Z2K5Lgk/iI=”,请注意看最后那个值
“7Z2K5Lgk/iI=”,多了一个斜杠,提示找不到该文件。
哎,我又动了动脑子,用Server.UrlEncode了这个“7Z2K5Lgk/iI=”,可是还是不行,显示的地址栏是:
http://localhost:883/Third/Details/7Z2K5Lgk%2fiI%3d,但是识别的是/Third/Details/7Z2K5Lgk/iI=,也就是说
那个倒霉的斜杠还存在,还是不行呀。

四,有位朋友说把数字与一个随机进行运算,然后在那边再逆向运算一下,这个如何保证这个随机数,在加密解密的
过程中一致呢?

同志们,还有其他高招吗?非常感谢。
...全文
20285 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
IT_Admin123 2017-01-11
  • 打赏
  • 举报
回复
我想要的是在js 中对一个json对象加 location.href="/Home/Index?v={ID='1',Name='张三',Age=14}" 然后在controler里面去解密有没有办法你们说了半天也没有个方案....,你们所说的都不太合适这个哥们是在后面只加密一个数字这个相对简单点如果是一个json对象并且是在js中呢如何加密啊
skyshowshow 2016-11-12
  • 打赏
  • 举报
回复
引用 16 楼 bwangel 的回复:
URL加密其实毫无意义。不管你的URL加密多长,如何巧妙。我知道了你的URL,一样可以毫无困难地在浏览器地址栏COPY,然后回车。真正需要安全的网页,应该是有内部身份验证机制的,而不是通过URL加密。
你都说了copy,回车,这是正常的请求,就算你不copy,也要正确的显示在前端,加密就可以避免恶意篡改参数值进行的非法请求
bwangel 2014-05-19
  • 打赏
  • 举报
回复
URL加密其实毫无意义。不管你的URL加密多长,如何巧妙。我知道了你的URL,一样可以毫无困难地在浏览器地址栏COPY,然后回车。真正需要安全的网页,应该是有内部身份验证机制的,而不是通过URL加密。
huhailong520 2014-05-19
  • 打赏
  • 举报
回复
引用 13 楼 lizeyuan8238386 的回复:
用签名和key 不可以吗 客户端配置一个key,对所有的参数(包含key)生成一个签名,接收到参数之后在对参数进行加密比较
+1 也是我常用的方法....哈哈
石头商人 2014-05-16
  • 打赏
  • 举报
回复
http://www.cnblogs.com/jerrmy/p/3498423.html
  • 打赏
  • 举报
回复
用签名和key 不可以吗 客户端配置一个key,对所有的参数(包含key)生成一个签名,接收到参数之后在对参数进行加密比较
webdiyer 2014-05-12
  • 打赏
  • 举报
回复
楼主要加密url中的ID的目的是什么呢?
jimil 2014-05-12
  • 打赏
  • 举报
回复
URL加密的方法超多,有的用传统des加密,有的在点击时保存27再在新页面调用,有的是伪静态,合适的地方用合适的方法,那就OK了。 你的情况我不太了解,如果硬要加密,8楼的DES用的人很多,如果保密级更高,你需要自己写了,没人会把这种东西公布出来。 当然,你说的问题如果要解决其实也简单,把/转成其它符号,使用时转回来就行了。
宝_爸 2014-05-12
  • 打赏
  • 举报
回复
还可以加密后,取得byte,进行base64 编码。 不过我觉得最好还是改成post传值,让https去加密吧。
宝_爸 2014-05-12
  • 打赏
  • 举报
回复
多UrlEncode一次试一试: string res1 = HttpUtility.UrlEncode("7Z2K5Lgk/iI="); //值是7Z2K5Lgk%2fiI%3d string res2 = HttpUtility.UrlEncode(res1); //值是: 7Z2K5Lgk%252fiI%253d string res3 = HttpUtility.UrlDecode(res2); //值是7Z2K5Lgk%2fiI%3d string res4 = HttpUtility.UrlDecode(res3); //值是7Z2K5Lgk/iI= asp.net mvc应该只帮你decode一次。
by_封爱 2014-05-12
  • 打赏
  • 举报
回复
http://bbs.csdn.net/topics/390784594 我的天啊 一个URL而已..无非就是一个ID还加密? http://bbs.csdn.net/topics/390784594 这帖子也没有啊 jd taobao 啥都没加密吧....如果你真信要加 就des加密吧 虽然他会生成特殊技符号导致不能正常接收.. 但是你可以接受之后在转回来 比如 我是这样做的..

 /// <summary>
    /// DES加密字符串
    /// </summary>
    /// <param name="encryptString">待加密的字符串</param>
    /// <param name="encryptKey">加密密钥,要求为8位</param>
    /// <returns>加密成功返回加密后的字符串,失败返回源串</returns>
    public static string EncryptString(string encryptString)
    {
        try
        {
            byte[] rgbKey = Encoding.UTF8.GetBytes(JT_key.Substring(0, 8));
            byte[] rgbIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
            byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);
            DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider();
            MemoryStream mStream = new MemoryStream();
            CryptoStream cStream = new CryptoStream(mStream, dCSP.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
            cStream.Write(inputByteArray, 0, inputByteArray.Length);
            cStream.FlushFinalBlock();
            string s = Convert.ToBase64String(mStream.ToArray());
         s=s.Replace("+", ".").Replace("&", "/");
         //将加密的字符串里的+ &给替换到 否则URL传参过去会失效\
        return s;
        }
        catch
        {
            return encryptString;
        }
    }

/// <summary>
    /// DES解密字符串
    /// </summary>
    /// <param name="decryptString">待解密的字符串</param>
    /// <param name="decryptKey">解密密钥,要求为8位,和加密密钥相同</param>
    /// <returns>解密成功返回解密后的字符串,失败返源串</returns>
    public static string DecryptString(string decryptString)
    {
        try
        {
            byte[] rgbKey = Encoding.UTF8.GetBytes(JT_key.Substring(0, 8));
            byte[] rgbIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
         //把要解密的字符串的.跟/替换到原来没有解密的样子
    decryptString = decryptString.Replace(".", "+").Replace("/", "&");
            byte[] inputByteArray = Convert.FromBase64String(decryptString);
            DESCryptoServiceProvider DCSP = new DESCryptoServiceProvider();
            MemoryStream mStream = new MemoryStream();
            CryptoStream cStream = new CryptoStream(mStream, DCSP.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
            cStream.Write(inputByteArray, 0, inputByteArray.Length);
            cStream.FlushFinalBlock();
            string s = Encoding.UTF8.GetString(mStream.ToArray());
            return s;
        }
        catch
        {
            return decryptString;
        }
    }




woodyy 2014-05-12
  • 打赏
  • 举报
回复
引用 2 楼 sp1234 的回复:
你的那些东西可真够“乱”的。能不能按照一些更有知识逻辑来组织你的设计思路呢?
你仅看到我一个url传值加密的问题,如何知道我的东西“乱”。 您所谓的有知识逻辑设计是指什么?悉心受教。 是关于url加密的,还是关于整体框架设计的, url加密无非就这几个方式,全球也就这么几个,别无他法。 您有高招?
woodyy 2014-05-12
  • 打赏
  • 举报
回复
引用 1 楼 sp1234 的回复:
你应该对你Des加密得到的byte[]执行urlencode,对27执行它干什么?
这个加密算法是我在博客园找的,谁写的无妨,后来我google后发现大家都这么在用,堆成加密方式。 我google了下“c#对称加密”发现都是这个,我就是用的这个。
woodyy 2014-05-12
  • 打赏
  • 举报
回复
引用 3 楼 tcmakebest 的回复:
就这么个URL还加密,真会折腾的,实在需要的话可以这样,每条记录生成一个36位长度的GUID,比如是: A86F3284-5694-48d0-819E-1464BCF90B9B
我考虑过这个办法,这个不可行,必须把guid当主键,否则外键得存放两个,一个是id,一个是guid,这样做弊端太多。 guid当主键,目前还不需要,而且数据量比较大,检索速度会很慢的。我之前做过一个guid做主键的项目。
tcmakebest 2014-05-11
  • 打赏
  • 举报
回复
就这么个URL还加密,真会折腾的,实在需要的话可以这样,每条记录生成一个36位长度的GUID,比如是: A86F3284-5694-48d0-819E-1464BCF90B9B
卖水果的net 2014-05-11
  • 打赏
  • 举报
回复
LZ不妨先把 27 转成 全角的27,再Server.UrlEncode再传过去,那边再把全角转成半角。
  • 打赏
  • 举报
回复
你的那些东西可真够“乱”的。能不能按照一些更有知识逻辑来组织你的设计思路呢?
  • 打赏
  • 举报
回复
你应该对你Des加密得到的byte[]执行urlencode,对27执行它干什么?

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧