有的时候 我们需要和flash交互 这就涉及到数据的交互 flash给我们提交数据 我们往处理后添加数据库.
这个时候 就会有安全问题 flash提交的数据 可能被截获。然后把伪装提交数据。 比如说flash游戏 玩完游戏加积分 然后把积分加到数据库里 。每次玩完flash都提交post提交一个 userid:2,gamenumber:30 如果被别人截获后 (推荐个截取工具 httpwatch) 修改下 userid:2,gamenumber:300000 然后就一下子加了几万份 (曾经QQ空间里的游戏 我就这样刷分过 全部刷到9999999) 这就有很大的安全隐患 尤其是我们的积分可以兑换实物的时候
目前网上的做法是使用 https 协议 还有另一种常用的做法是 调用webservice
我这里使用的是另一种
首先 和flash开发人员 约定一个MD5公钥 (比如 wlf 然后把wlf用MD5加密(也可以用别的方式加密) 变为fc6796eaaf289c444c76c8fc818bf73c)
然后flash 提交的时候 假设提交 userid:2,gamenumber:30 这是不安全的 现在开始加密 现在他要给我传的是
userid:2,gamenumber:30,t:2011051011053232,m:EUDHSKBHJSHDUIWHDJKHJ
这里面 t 是时间戳 就是flash提交时的当前时间 m则很关键 m是个密钥 时间戳(这里是2011051011053232)+userid(这里是2)+gamenumber(这里是30)+公钥) 拼接成一个字符串 然后再用MD5加密出来的
现在 我们接受到了上述东西 其他人也截获了上述东西
我们把 时间戳+userid+gamenumber+公钥 组成个字符串 然后用MD5加密 看看是不是与传过来的m相等 相当 则说明没有被篡改活
如果对方把gamenumber改为90 那么m一定是不相同的 则是篡改过的
如果谁有更好的方法 希望告诉下~~谢谢
下面贴个方法~~
/// <summary> /// 判断传过来的参数连一起在MD5加密后是与传过来的密钥相等 /// </summary> /// <param name="miyao"> 传过来的密钥 </param> /// <param name="parm"> 传过来的参数 </param> /// <returns> 返回true则说明没有篡改 false则说明篡改过 </returns> public static bool IsTrue( string miyao, params string [] parm) { StringBuilder sb = new StringBuilder(); foreach ( string s in parm) { sb.Append(s); } sb.Append(GameKey); // 公钥 string m = EncryptMD5(sb.ToString()); // 拼接后MD5加密的密钥 if (m.ToLower() == miyao.ToLower()) { return true ; } else { return false ; } } /// <summary> /// MD5加密 /// </summary> /// <param name="txt"></param> /// <returns></returns> public static string EncryptMD5( string txt) { return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(txt, " MD5 " ); }