我和我的团队正在开发一个API /中间件系统,该系统要求对中间件层发出的所有请求都使用公钥和私钥对请求进行签名以确保安全。这些请求中的大多数都是服务器到服务器,但iPhone和Android应用程序等移动应用程序除外,这些应用程序将直接从中间件查询数据。
我们已经实现了我们的签名库,它非常密切地反映了Amazon Market API使用排序查询字符串的工作方式,并使用公钥和私钥进行HMAC 256哈希,以生成在收到时使用相同算法进行比较的签名。
不幸的是,我们刚刚(在游戏中稍晚)了解到,为了通过应用程序商店发布iPhone应用程序,您必须满足某些政府标准才能实现加密库(读作出口限制)。现在我们被迫决定是否应该重新编写我们的签名算法以使用更简单的方法,例如在查询字符串中附加私钥,并对其进行哈希处理以进行比较。
我讨厌采用一种高度安全的方法并将其减少为私钥中的哈希值,但我对安全性并加密并不熟悉,以便通过删除HMAC 256来了解我长期失去的内容。(注意:查询字符串已包含公钥)
例如,我们目前订购我们的查询字符串并执行这样的操作来签名:
$signature = base64_encode( hash_hmac( 'sha256', $querystring, $private_key, TRUE ) );
如果我们被迫不在我们的应用程序中使用加密类,那么我们的签名将如下所示:
$signature = base64_encode( sha1( $querystring . $private_key ) );
从技术上讲,我们可能符合在我们的应用程序中使用该库的标准,但我不知道如果美国政府决定我们正在做的事情并不完全符合他们的法律,我是否愿意承担法律后果的风险'authentication'的描述。
非常感谢安全大师的任何建议!通过使用第二个代码示例我输了什么,它是否更容易破坏我们的中间件?
答案 0 :(得分:0)
如果其他人最终处于类似情况,至少在我们的情况下,我们使用的加密方法(如上所述)确实符合法律要求并与Apples ToS一起使用。我们基本上实现了亚马逊AWS风格的身份验证,但事后看来,OAuth 1.0只是一个更强大的方法,预先构建的库可以帮助我们。
如果你今天在应用程序中进行这种类型的身份验证,我肯定会建议寻找OAuth。