首先,我不确定在哪个Stack Exchange网站上询问这个问题,如果这是错误的我道歉。
我阅读this文章,讨论在您的移动应用上存储API密钥的最安全方式,我感兴趣的方法之一是具有在本地生成API密钥并具有相同功能的函数服务器,没有人可以破解你的代码并获得API密钥字符串文字。这正是文章所说的内容:
您的设备无需存储任何类型的密钥并处理保护字符串文字的所有麻烦!这是远程密钥验证等服务使用的一种非常古老的技术。
客户端知道返回密钥的函数()。 后端知道客户端中实现的function() 客户端通过function()生成密钥,并将其传递给服务器。 服务器验证它,并继续请求。 你在连接点吗?而不是让一个本机函数返回一个字符串(容易识别)为什么没有一个函数返回1到100之间的三个随机素数之和?或者以unixtime表示的当前日期的函数,并为每个不同的数字添加1?如何从设备中获取一些上下文信息,例如使用的内存量,以提供更高程度的熵?
现在我想知道的是,为了防止假设黑客使用您用来提供有效API密钥的相同算法,该怎么做?在我看来,函数看起来像这样(用javascript编写):
function generateKey() {
var key = 0
for(var i=0; i<4; i++) {
key *= Math.floor((Math.random() * 10) + 1);
}
return key // after encrypting it with unixtime as seed, for example
}
请原谅,如果这个功能不起作用或者是愚蠢的,那么这只是我想到的第一件事。那么黑客是不是可以在对代码进行逆向工程之后,只需遵循相同的方法并提出一个服务器将标记为有效的密钥?
如果您希望在答案中发布示例,请随意省略加密,因为我只需要简单的概念证明&#39;答案。
由于
答案 0 :(得分:1)
没有什么可以阻止攻击者这样做。如果攻击者可以对您的应用进行逆向工程,他们会找到您存储在其中的任何秘密。
文章的重点是如何让假想的逆向工程师尽可能地找到你的秘密。这就是为什么在文章中,作者正在从一种Java方法(易于分解)转向本机方法(不是很容易反编译,但可以通过他们正在使用的长而看似随机的API密钥来识别)生成的密钥。