API认证的设计和可编程性(API authentication design and hackab

2019-09-01 18:54发布

问:这是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&param1=x&param2=y

此API不需要会话,不用于第三方代表用户的使用。 相反,它是由用户自己来使用。

我真的很喜欢这样的简单。 的要求apiCallId是唯一的,始终增加装置重复使用sig是不可能的,所以我觉得它是安全的(保护,以防止重放攻击),但我不是专家。

其他API使用所有计算时按字母顺序排序的GET参数的sig ,但我不明白为什么包括当这是必要的apiCallId

请尝试和它的实现和释放之前黑客现在这个。

我欢迎任何意见,建议和安全教育。

Answer 1:

你在做什么,似乎都是合理的,但不检查参数(这将是一个相当大的问题)。

东西是非常相似的设计,它可能是明智的复制是亚马逊网络服务请求认证方案

特别是请确保该参数的编码方案是明确的和可逆的; 亚马逊搞砸这件事在一个点上。 从自己的错误中学习。 :)

密码学来说,你在做什么不叫签名,而是一个消息认证码(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这样你就可以检查你的代码。



Answer 2:

号等参数(参数1和参数在你的例子)的完整性不受保护。 攻击者可以截获通话,并改变这些,因为他转发前喜欢。 该apiCallId不仅防止重放,而不是第一个呼叫的改变。

我不是专家。 如果我一眼就看出了,有可能是潜伏的其他问题。



Answer 3:

那么假设我知道这个秘密,那么我可以生成签名,并将其传递。 什么在做我的初创企业是通过使SIG进一步采取SIG PARAM依靠其他参数也是一个请求ID(UUID)和时间戳和商店,UUID(对了几个小时安全原因拒绝的黑客调用同一个功能一遍又一遍)。 这样,您就不能再次拨打同一电话,你就必须产生新的UUID,如果黑客在参数的签名无效信号替换UUID,他不知道如何生成的签名,因为不是秘密等,我们都基于内部密钥其长度为30个字符也生成签名。 所以essenity

MD5(PARAMS + APiKEY + CALLID + Secert + someLonginternalKey的按字母顺序排列)

如果不相信,我回答了你的问题,但多数民众赞成在做安全API的另一种方式



Answer 4:

我会建议使用数字签名在这种情况下,因为他们更合适。 数字签名在例如apikey是绰绰有余。 你甚至都不需要apisecret和它的哈希值。 你只需要确保数字签名的私密性(就像MD5哈希值)。

如果你想防止重放攻击,你需要在每一个请求某种随机性。 所以我建议如下:

服务器 - > API:随机数(=一些随机数)

API - >服务器:的Enc(随机数+数字签名)

这个加密与服务器的公钥和数字签名被放置在服务器的私钥。

现在,你不能有一个重放攻击。 但是仍然有在中间人攻击的问题,但解决这个不那么微不足道(但很可行)。 所以,这取决于你想要/安全级别需要,你可以调整你的技术措施。



文章来源: API authentication design and hackability