加密Android设备上的信息(合理保护用户不被访问)

加密Android设备上的信息(合理保护用户不被访问),android,security,encryption,obfuscation,Android,Security,Encryption,Obfuscation,我们正在制作一款Android应用程序,一款问答游戏,我们想在用户离线时将问题+答案缓存起来。问题是,我们需要在用户回答问题之前保留这些数据。否则,作弊将非常容易,这将损害游戏。然后可以提取所有问题和答案,并自动将答案提交到服务器API 最方便的方法是在安装时从我们的服务器检索密钥或机密,将其隐藏在“某处”,并将其用于与服务器通信,以及对存储中的问题+答案进行加密。但显然,把它藏在“某处”并不是一个安全的概念 我做了一些研究,在这种情况下,可靠的加密似乎是不可能的,因为应用程序必须“知道”秘密(

我们正在制作一款Android应用程序,一款问答游戏,我们想在用户离线时将问题+答案缓存起来。问题是,我们需要在用户回答问题之前保留这些数据。否则,作弊将非常容易,这将损害游戏。然后可以提取所有问题和答案,并自动将答案提交到服务器API

最方便的方法是在安装时从我们的服务器检索密钥或机密,将其隐藏在“某处”,并将其用于与服务器通信,以及对存储中的问题+答案进行加密。但显然,把它藏在“某处”并不是一个安全的概念

我做了一些研究,在这种情况下,可靠的加密似乎是不可能的,因为应用程序必须“知道”秘密(无论是证书、密码短语+salt还是其他什么),或者至少在哪里可以找到它,而这可以通过反编译来提取。然而,我们可以接受这样的困难

问题是:你知道有什么方法可以让普通用户很难从APK检索到秘密,也就是说,几乎不可能编写自动密钥提取程序吗?

到目前为止,我最好的猜测是:

  • 在数据库中隐藏一些信息,并将其用作密钥的salt
  • 将设备中的几位信息添加为salt(IMEI、电子邮件地址、序列号……)——也许再加上混淆salt的应用方式可能很难获得

您可以为每个问题使用单独的键,这取决于上一个问题的答案。因此,除非您已经回答了问题1,否则无法解密问题2。

您可以为每个问题使用单独的密钥,这取决于前一个问题的答案。因此,除非您已经回答了问题1,否则无法解密问题2。

啊,这太好了!我们希望避免在这些问题上强加具体的命令,但我们可以接受。你认为它在没有加密链的情况下也可以工作,但是每个问题都有一个用正确答案加密的令牌吗?啊,这太好了!我们希望避免在这些问题上强加具体的命令,但我们可以接受。你认为它在没有加密链的情况下也可以工作,但是每个问题都有一个用正确答案加密的令牌吗?答案的格式是什么?错误答案的惩罚是什么?当然,对于任何选择题来说,答案都是非常简单的。答案要么是选择题枚举(1到n个正确的选项),要么是纯文本,要么是数字,要么是图像坐标范围(拼图)——也许还有更多。当然,我们也应用了判断答案是否正确的算法,比如对于纯文本答案的levenshtein距离;用户总是可以在模拟器中尝试所有问题,然后从错误答案的快照还原。按照计划,问题的顺序是随机的,一个测验可能不包含另一个测验的问题,因此这并没有问题那么大。但是THX,这是我们现在错过的另一个攻击向量:如果用户在回答问题之前立即抓拍,随机化就不起作用了。一个不同的游戏设计完全可以解决这个问题(例如,你可能会犯很多错误,但你不知道答案是否正确,直到服务器告诉你;它不再是真正的“问答机”式游戏)。答案的格式是什么?错误答案的惩罚是什么?当然,对于任何选择题来说,答案都是非常简单的。答案要么是选择题枚举(1到n个正确的选项),要么是纯文本,要么是数字,要么是图像坐标范围(拼图)——也许还有更多。当然,我们也应用了判断答案是否正确的算法,比如对于纯文本答案的levenshtein距离;用户总是可以在模拟器中尝试所有问题,然后从错误答案的快照还原。按照计划,问题的顺序是随机的,一个测验可能不包含另一个测验的问题,因此这并没有问题那么大。但是THX,这是我们现在错过的另一个攻击向量:如果用户在回答问题之前立即抓拍,随机化就不起作用了。一个不同的游戏设计完全可以解决这个问题(例如,你可以随意犯错,但在服务器告诉你之前,你不知道答案是否正确;不过,它不再是真正的“问答机”式游戏)。