问:这是API认证技术很容易被破解?
apiKey = "123456789"
apiCallId = "1256341451"
apiSecret = "67d48e91ab2b7471d4be2a8c2e007d13"
sig = md5(apiKey + apiCallId + apiSecret) = 09c297a354219f173bfc49c2e203ce03
哪里
-
apiKey
:对用户的某些唯一标识符 -
apiCallId
:一个唯一的整数必须在值增加(例如UNIX时间戳) -
apiSecret
:字符串只知道给用户,而我们-在URL未通过 -
sig
:此API调用的“牢不可破的”签名- MD5哈希
API呼叫范例:
http://api.domain.com/?apiKey=123456789&apiCallId=1256341451&sig=09c297a354219f173bfc49c2e203ce03¶m1=x¶m2=y
此API不需要会话,不用于第三方代表用户的使用。 相反,它是由用户自己来使用。
我真的很喜欢这样的简单。 的要求apiCallId
是唯一的,始终增加装置重复使用sig
是不可能的,所以我觉得它是安全的(保护,以防止重放攻击),但我不是专家。
其他API使用所有计算时按字母顺序排序的GET参数的sig
,但我不明白为什么包括当这是必要的apiCallId
。
请尝试和它的实现和释放之前黑客现在这个。
我欢迎任何意见,建议和安全教育。
你在做什么,似乎都是合理的,但不检查参数(这将是一个相当大的问题)。
东西是非常相似的设计,它可能是明智的复制是亚马逊网络服务请求认证方案
特别是请确保该参数的编码方案是明确的和可逆的; 亚马逊搞砸这件事在一个点上。 从自己的错误中学习。 :)
密码学来说,你在做什么不叫签名,而是一个消息认证码(MAC)。 MAC系统可以创建和任何人谁共享密钥验证(以下简称“签名”这一术语通常保留给像DSA或RSA公钥方案)。 MD5(MSG || K)是已知的,合理健全MAC; 我不知道如果因意外或故意错过了,但在表面上似乎是一个方法是等效的,MD5(K ||味精),是非常不安全的,因为在MD5(以及如何大多数其他散列怪癖功能)被设计意味着如果知道H(米),则可以很容易地计算H(米|| M2)为任何平方米 - 因此,如果您使用MD5(K ||参数1 = 5),有人能够实现该导线然后创建MD5(K ||参数1 = 5,参数2 = 666)。 (这或许有点更多的技术比你感兴趣,但这种被称为长度扩展属性 )。
但是同时MD5(K ||味精)可能是“精”,你最好使用像HMAC,因为它实际上是设计成一个MAC。 MD5有很多的问题,但没有直接影响其作为Mac中使用(但 - MD4已经以这种方式打破)。 因此,对于未来的打样(和审核校对)使用HMAC与SHA-1或SHA-256来代替。 即使你不希望在一个加密库拉,HMAC是很简单,有可用于已知值SHA-1和SHA-2这样你就可以检查你的代码。
号等参数(参数1和参数在你的例子)的完整性不受保护。 攻击者可以截获通话,并改变这些,因为他转发前喜欢。 该apiCallId
不仅防止重放,而不是第一个呼叫的改变。
我不是专家。 如果我一眼就看出了,有可能是潜伏的其他问题。
那么假设我知道这个秘密,那么我可以生成签名,并将其传递。 什么在做我的初创企业是通过使SIG进一步采取SIG PARAM依靠其他参数也是一个请求ID(UUID)和时间戳和商店,UUID(对了几个小时安全原因拒绝的黑客调用同一个功能一遍又一遍)。 这样,您就不能再次拨打同一电话,你就必须产生新的UUID,如果黑客在参数的签名无效信号替换UUID,他不知道如何生成的签名,因为不是秘密等,我们都基于内部密钥其长度为30个字符也生成签名。 所以essenity
MD5(PARAMS + APiKEY + CALLID + Secert + someLonginternalKey的按字母顺序排列)
如果不相信,我回答了你的问题,但多数民众赞成在做安全API的另一种方式
我会建议使用数字签名在这种情况下,因为他们更合适。 数字签名在例如apikey是绰绰有余。 你甚至都不需要apisecret和它的哈希值。 你只需要确保数字签名的私密性(就像MD5哈希值)。
如果你想防止重放攻击,你需要在每一个请求某种随机性。 所以我建议如下:
服务器 - > API:随机数(=一些随机数)
API - >服务器:的Enc(随机数+数字签名)
这个加密与服务器的公钥和数字签名被放置在服务器的私钥。
现在,你不能有一个重放攻击。 但是仍然有在中间人攻击的问题,但解决这个不那么微不足道(但很可行)。 所以,这取决于你想要/安全级别需要,你可以调整你的技术措施。