TL;博士
我正在开发一个游戏系统,它在客户端上使用UnityScript和 C#,在服务器上使用 PHP。数据的 MD5 散列和共享密钥用于检查数据在传输过程中是否被修改。MD5 够用吗?我可以使用哪些其他哈希算法适用于所有三种语言?
更详细的问题
我在一个广泛使用的社区网站上遇到了一些关于流行的游戏开发平台Unity 的代码,我现在正在努力改进该代码的 MySQL、PHP 和安全性。
该代码使用在客户端和服务器之间共享的“密钥”值。来自客户端的所有消息都包括数据的散列(例如名称和分数)以及密钥,服务器在接受数据之前会检查该密钥。这基本上是通过的数据未被篡改的身份验证。
但是,因为它是 MD5,我认为监听网络流量的人可以轻松计算出密钥,然后将他们想要的任何数据发布到服务器。
所以我的问题是:
- 这种现状是否值得改善?或者这是 MD5 的预期当前用途(截至 2017 年 1 月)?
- 是否有另一种散列算法可以进一步改进/验证这种通信活动?请注意,该算法需要在 PHP、UnityScript 和 C# 中工作。
代码
在 UnityScript(客户端)中:
var hash=Md5.Md5Sum(name + score + secretKey);
在 C#(客户端)中:
string hash = MD5Test.Md5Sum(name + score + secretKey);
在 PHP(服务器端)中:
$secretKey = "mySecretKey"; // Change this value to match the value //stored in the client javascript below $realHash = md5($_GET['name'] . $_GET['score'] . $secretKey); if($realHash == $hash) { //interact with database }
进一步的标准
一些 Unity 程序员使用 UnityScript(一种类似 Python 的语言,在 .NET API 上具有类似 JavaScript 的语法),但不能假定已安装任何库。
游戏开发人员不是PHP / MySQL 程序员,那么复杂或第 3 方 PHP/C#/Js 代码可能不会有帮助。
BCrypt 显然与 C# 一起使用是不明智的
在这种情况下, BCrypt 需要一个静态盐(可能是从密钥派生的?),但它旨在使用随机盐。
PBKDF2 似乎比 BCrypt 更受欢迎,但可能非常慢,特别是在没有太多内存的移动设备上。
不能指望与安全服务器打交道(如果只是......)。
我对C# 安全库知之甚少,无法从所列内容中真正挑选出最佳选项。
虽然概述的代码只是与高分更新有关,但此代码已在过去 - 并将在未来 - 用于将各种公共和私有数据传输到各种数据库。
处理 PHP、UnityScript、C# 之间的哈希算法互操作性是一个比我预想的更大的障碍。如果只是PHP,我会使用
password_hash
.
这个问题的一些想法和背景:
我更新了标题,因为编辑后的标题似乎表明我不确定是否要更改 MD5,而知道我应该更改 MD5 是首先在这里提出问题的核心原因之一。
最初的问题是,我想更新这里(以及其他地方)给出的关于如何处理客户端计算机上的游戏和远程服务器上的数据存储之间的交互的糟糕代码建议。请记住,这是针对 Unity 初学者程序员的代码建议,该站点 [现在] 由 Unity Technologies 自己运行。
如果你看,原来的问题(上面链接)是使用 PHPMysql_
函数(以及相当糟糕的无效 PDO 形式)。我觉得这将受益于重写。我看到原始代码还使用 md5 例程对预期数据进行哈希处理。当谈到替换 MD5 时,我既没有意识到编译项目文件的漏洞,也没有意识到使这个代码块实际上更安全所需的工作的大小/规模(在与服务器或客户端的交互上)数据)。我最初的任务是找到一个合适的 MD5 替代品,它可以在所需的各种语言(UnityScript、C#、PHP)中工作,因为我知道它的不足之处。我没有意识到(从这里的评论来看)闯入 exe 并获取硬编码数据实际上是多么乏味。这个问题是不是关于比赛我做,是不是我的项目,并引述我打算替换代码不是我写的。我阅读了很多关于人们以某种方式对信使进行尝试的评论,但这个问题来自我自己希望改善教学 wiki 网站上现有缺陷的愿望。我非常尊重在回答这个问题时所分享的知识,但我知道,在过去 6 个月探索 Unity 文档和学习网站的过程中,在保护本地应用程序和多人游戏或其他远程交互方面存在很大差距。
我在评论中看到很多回复者说乔治给出的答案是一个糟糕的答案——但它回答了我当时提出的具体问题。谢谢。
最后一点:
这篇来自 Luke Briggs 评论的 Blob 帖子强调了操作本地 Unity 游戏应用程序数据的过程非常简单。我完全不理解本地文件有多么脆弱......