我正在制作一个小型网络游戏,其中包含任务和解决方案,解决方案是通过输入完成任务后向用户提供的代码来解决的。为了保证一定的安全性(防止作弊),我不想以明文形式存储游戏生成的代码。但由于需要在玩家完成任务后给出代码,所以我不能对其进行哈希处理,否则就无法检索到它。那么,使用Python加密/解密数据的最安全方式是什么?
最安全的加密是没有加密。密码应该被转化为哈希值。这是一种单向转换,使密码(几乎)无法恢复。当给某人一个代码时,您可以采取以下措施来确保实际安全。(1) 生成一些随机字符串。(2) 将字符串提供给他们。(3) 保存您生成的字符串的哈希值。只需执行一次。如果他们“忘记”了代码,您必须 (1) 确定他们有资格获得代码,然后 (2) 再次执行此过程(生成新代码,将其提供给他们,保存哈希值)。
如果您的脚本可以解密密码,那么入侵者也可以。加密只有在有人输入密码进行解锁时才真正有用——如果它保持解锁状态(或者脚本有密码解锁它),那么加密就毫无意义了。这就是为什么哈希更有用,因为它是一个单向过程——即使有人知道您的密码哈希值,他们也不知道必须输入什么明文才能生成它(除非进行大量暴力破解)。我不会担心保留游戏密码的明文。如果您担心安全问题,请修复可能存在的SQL注入等漏洞,确保您的Web服务器和其他软件已经更新并正确配置等。也许考虑一种方式,使得盗取密码变得不如实际玩游戏有吸引力?例如,有一个游戏(我不记得是哪个)使用级别跳过作弊,你可以进入下一级别,但它不会标记为“完成”,或者你可以跳过级别,但不会得到任何分数。或者看看Project Euler,你可以做任何级别,但只有在输入答案后才能得到分数(而计算答案才是游戏的全部意义,所以作弊会破坏游戏的乐趣)。如果您真的很偏执,可以可能使用非对称加密,其中您基本上使用key A加密某些内容,只有使用key B才能读取它。我想出了一个类似的概念,使用GPG加密(流行的非对称加密系统,主要用于电子邮件加密或签名)来保护网站数据。我不太确定这如何适用于保护游戏级别密码,正如我所说,您需要非常偏执才会考虑这个。简而言之,我建议以明文存储密码,并将安全问题集中在其他地方(Web应用程序代码本身)。