API/中间件认证通信-请求完整性检查



我和我的团队正在开发一个API/中间件系统,该系统将要求向中间件层发出的所有请求都使用公钥和私钥对请求进行签名,以保证安全性。除了iPhone和Android等移动应用程序直接从中间件查询数据外,大多数请求都是服务器到服务器的。

我们已经实现了我们的签名库,非常紧密地反映了亚马逊市场API的工作方式,使用排序查询字符串和HMAC 256哈希公钥和私钥生成签名,使用相同的算法在接收时进行比较。

不幸的是,我们刚刚了解到(在游戏的后期),为了通过应用程序商店发布iPhone应用程序,您必须满足某些政府标准,以实现加密库(阅读为出口限制)。现在我们被迫决定是否应该重新编写签名算法,以使用更简单的方法,例如将私钥附加到查询字符串并对其进行SHA1()哈希以进行比较。

我讨厌采取高度安全的方法,并将其减少到只是在私钥中散列,但我对安全和加密不够熟悉,不知道通过放弃HMAC 256,我在长期内会失去什么。(注意:查询字符串已经包含了公钥)

例如,我们当前对查询字符串排序,并执行如下操作对其签名:

$signature = base64_encode( hash_hmac( 'sha256', $querystring, $private_key, TRUE ) );

如果我们被迫不在我们的应用程序中使用crypto类,那么我们的签名将是这样的:

$signature = base64_encode( sha1( $querystring . $private_key ) );

从技术上讲,我们可能符合在我们的应用程序中使用库的标准,但我不知道如果美国政府决定我们所做的事情不完全符合他们对"身份验证"的法律描述,我是否想冒法律后果。

任何和所有的建议,从你的安全专家那里是非常感激的!我使用第二个代码示例失去了什么,它是否使我们的中间件更容易破解?

如果其他人最终处于类似的情况,至少在我们的情况下,我们使用的加密方法(如上所述)符合法律要求,并与apple ToS兼容。我们基本上实现了一种Amazon AWS风格的身份验证,尽管事后看来OAuth 1.0会是一个更强大的方法,有预先构建的库来帮助实现。

如果你今天要在应用程序中做这种类型的身份验证,我绝对建议你看看OAuth。

最新更新