Unity C# MD5验证

发表于2017-10-16
评论0 1.5k浏览

下面给大家介绍的是UnityC# MD5验证,因为数据经网络传输后会变得非常不安全,最简单有效的解决方案是给数据加一个密钥,使用MD5 算法算出校验码,服务器收到数据和校验码后在进行比较校验码是否正确,以此来判断数据是否修改过。 PHP生成 的 MD5 校验默认为32位的字符串,  而C#默认的是16位的字节数组,需要略加修改,转为32个字节的字符串,代码如下:

参考地址为:  http://wiki.unity3d.com/index.php?title=MD5

  1. public static string Md5Sum(string strToEncrypt)  
  2. {  
  3.     // 将需要加密的字符串转为byte数组  
  4.     byte[] bs = UTF8Encoding.UTF8.GetBytes(strToEncrypt);  
  5.   
  6.     // 创建md5 对象  
  7.     System.Security.Cryptography.MD5 md5;  
  8.     md5 = System.Security.Cryptography.MD5CryptoServiceProvider.Create();  
  9.   
  10.     // 生成16位的二进制校验码  
  11.     byte[] hashBytes = md5.ComputeHash(bs);  
  12.   
  13.     // 转为32位字符串  
  14.     string hashString = "";  
  15.     for (int i = 0; i < hashBytes.Length; i )  
  16.     {  
  17.         hashString  = System.Convert.ToString(hashBytes[i], 16).PadLeft(2, '0');  
  18.     }  
  19.   
  20.     return hashString.PadLeft(32, '0');  
  21. }  


使用这个 MD5 函数非常简单, 在下面的代码示例中,数据是包含有 “hello world” 的一个字符串, 密钥位123, 使用Md5Sum算出32位的校验码字符串。

  1. string data = "hello world";  
  2. string key = "123";  
  3. 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 文件是不可能。

  1. using UnityEditor;  
  2. using UnityEngine;  
  3.    
  4. using System.Security.Cryptography;  
  5. using System.Text;  
  6.    
  7. public class ItemGUID : EditorWindow  
  8. {  
  9.     // Add menu item named "My Window" to the Window menu  
  10.     [MenuItem("UnityExtensions/Generate ItemGUID")]  
  11.     public static void ShowWindow()  
  12.     {  
  13.         MD5 md5Hash = MD5.Create();  
  14.         BaseItem[] items = FindSceneObjectsOfType(typeof(BaseItem)) as BaseItem[];  
  15.         foreach (BaseItem item in items)  
  16.         {  
  17.             byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(item.name));  
  18.             StringBuilder sBuilder = new StringBuilder();  
  19.                 for (int i = 0; i < data.Length; i )  
  20.                 {  
  21.                     sBuilder.Append(data[i].ToString("x2"));  
  22.                 }  
  23.    
  24.             item.guid = sBuilder.ToString();  
  25.         }  
  26.     }  
  27. }  

对我而言,我有许多游戏对象,表示我的游戏中的Items 。每个游戏对象都有 BaseItem 组件,其中包含items 统计的一些实用函数。

它有一个public 字符串 guid、 变量,每次我运行此编辑器脚本设置他。在创建新items时,我重新运行该脚本,将所有的 guid 变量重置为其名称的 md5 哈希值。

非常简单和快速,和最重要的是超级有效。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

标签:

0个评论