UnityC# MD5验证
2015-06-29 08:34
253 查看
孙广东 2014.6.24
数据经网络传输后会变得非常不安全,最简单有效的解决方案是给数据加一个密钥,使用MD5 算法算出校验码,服务器收到数据和校验码后在进行比较校验码是否正确,以此来判断数据是否修改过。 PHP生成 的 MD5 校验默认为32位的字符串, 而C#默认的是16位的字节数组,需要略加修改,转为32个字节的字符串,代码如下:
参考地址为: http://wiki.unity3d.com/index.php?title=MD5
使用这个 MD5 函数非常简单, 在下面的代码示例中,数据是包含有 “hello world” 的一个字符串, 密钥位123, 使用Md5Sum算出32位的校验码字符串。
服务器端:
如上文所指出,上述的unity代码将返回匹配那个从 PHP 的 md5() 函数返回的哈希值。如果在服务器端使用的另一种语言,这里有一些例子:
Shell你必须安装在服务器上的 md5sum 程序。 <bash>HASH = `echo "$STRING_TO_HASH" | md5sum | cut -f 1 -d' '` </bash>
在来看看在Unity中的其他应用:
为库存系统生成 md5 的哈希值。使用哈希值我有几个重要原因。1) 库存系统被链接到 PlayerPrefs。我需要一个非整数的方式来表示这个item 。2) 我想要使用某种形式的哈希值来表示该item ,因为事实证明很难有人通过修改 PlayerPrefs作弊。3) PlayerPrefs 键也是 md5 的哈希值,使得阅读 PlayerPrefs 文件是不可能。
对我而言,我有许多游戏对象,表示我的游戏中的Items 。每个游戏对象都有 BaseItem 组件,其中包含items 统计的一些实用函数。它有一个public 字符串 guid、 变量,每次我运行此编辑器脚本设置他。在创建新items时,我重新运行该脚本,将所有的 guid 变量重置为其名称的 md5 哈希值。非常简单和快速,和最重要的是超级有效。
数据经网络传输后会变得非常不安全,最简单有效的解决方案是给数据加一个密钥,使用MD5 算法算出校验码,服务器收到数据和校验码后在进行比较校验码是否正确,以此来判断数据是否修改过。 PHP生成 的 MD5 校验默认为32位的字符串, 而C#默认的是16位的字节数组,需要略加修改,转为32个字节的字符串,代码如下:
参考地址为: http://wiki.unity3d.com/index.php?title=MD5
public static string Md5Sum(string strToEncrypt) { // 将需要加密的字符串转为byte数组 byte[] bs = UTF8Encoding.UTF8.GetBytes(strToEncrypt); // 创建md5 对象 System.Security.Cryptography.MD5 md5; md5 = System.Security.Cryptography.MD5CryptoServiceProvider.Create(); // 生成16位的二进制校验码 byte[] hashBytes = md5.ComputeHash(bs); // 转为32位字符串 string hashString = ""; for (int i = 0; i < hashBytes.Length; i++) { hashString += System.Convert.ToString(hashBytes[i], 16).PadLeft(2, '0'); } return hashString.PadLeft(32, '0'); }
使用这个 MD5 函数非常简单, 在下面的代码示例中,数据是包含有 “hello world” 的一个字符串, 密钥位123, 使用Md5Sum算出32位的校验码字符串。
string data = "hello world"; string key = "123"; Md5Sum(data + key); // 返回
服务器端:
如上文所指出,上述的unity代码将返回匹配那个从 PHP 的 md5() 函数返回的哈希值。如果在服务器端使用的另一种语言,这里有一些例子:
Perl
<perl>use Digest::MD5 qw(md5_hex); my $hashString = md5_hex($stringToHash); </perl>PHP
< perl > $hashString = md5($stringToHash);< / perl >Python
<python>import hashlib def md5Sum(inputString):return hashlib.md5(inputString).hexdigest()< / python >
红宝石
require 'digest/md5' def md5Sum(inputString)Digest::MD5.hexdigest(inputString)end
Shell你必须安装在服务器上的 md5sum 程序。 <bash>HASH = `echo "$STRING_TO_HASH" | md5sum | cut -f 1 -d' '` </bash>
在来看看在Unity中的其他应用:为库存系统生成 md5 的哈希值。使用哈希值我有几个重要原因。1) 库存系统被链接到 PlayerPrefs。我需要一个非整数的方式来表示这个item 。2) 我想要使用某种形式的哈希值来表示该item ,因为事实证明很难有人通过修改 PlayerPrefs作弊。3) PlayerPrefs 键也是 md5 的哈希值,使得阅读 PlayerPrefs 文件是不可能。
using UnityEditor; using UnityEngine; using System.Security.Cryptography; using System.Text; public class ItemGUID : EditorWindow { // Add menu item named "My Window" to the Window menu [MenuItem("UnityExtensions/Generate ItemGUID")] public static void ShowWindow() { MD5 md5Hash = MD5.Create(); BaseItem[] items = FindSceneObjectsOfType(typeof(BaseItem)) as BaseItem[]; foreach (BaseItem item in items) { byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(item.name)); StringBuilder sBuilder = new StringBuilder(); for (int i = 0; i < data.Length; i++) { sBuilder.Append(data[i].ToString("x2")); } item.guid = sBuilder.ToString(); } } }
对我而言,我有许多游戏对象,表示我的游戏中的Items 。每个游戏对象都有 BaseItem 组件,其中包含items 统计的一些实用函数。它有一个public 字符串 guid、 变量,每次我运行此编辑器脚本设置他。在创建新items时,我重新运行该脚本,将所有的 guid 变量重置为其名称的 md5 哈希值。非常简单和快速,和最重要的是超级有效。
相关文章推荐
- Unity3D学习笔记第一课
- unity, List namespace
- unity5, UGUI刺穿问题解法
- unity架构原则(摸索、增补中)
- (译)Cg Programming/Unity(Cg编程/Unity)
- Unity3D之AssetBundle学习:Android上运行笔记
- [Unity-24] Unity的四种加载场景的方法
- unity手游《摩卡世界online》全套源码(服务端+客户端+数据库)
- unity资源管理
- Unity炸弹爆炸伤害(群攻伤害)
- 学习笔记:Unity战斗卡牌游戏(一)-----NGUI基础组件使用及代码修改获取
- 游戏引擎中三大及时光照渲染方法介绍(以unity3d为例)
- unity, remove a scene from build settings
- Unity 脚本学习总结
- Unity3d之A*算法在游戏中的应用(一)
- unity, read text file
- Unity 脚本优化
- Unity性能优化
- unity, 不要试图用rigidbody.Sleep()停止rigidbody
- Unity 自定义字体 Custom Font 原理 二