从多线程到分布式

项目实践(五)API安全

2023-08-20  本文已影响0人  吟游雪人

HMAC验签(带密钥的Hash摘要算法)

虽然简单的哈希计算可以有效防止令牌失窃,但不能防止写访问权限的攻击者插入伪造令牌。大多数的数据库在设计上并没有考虑提供恒定时间比较措施。可以通过计算消息验证码(Message Authentication Code,MAC)来解决这两个问题,如标准的基于哈希的MAC(HMAC)。HMAC的工作方式类似于普通的加密哈希函数,但它包含一个只有API服务器知道的密钥。

密钥共享

HMAC-SHA256使用的密钥只是一个32字节的随机值,因此可以使用SecureRandom类来生成一个密钥,类似数据库令牌ID的生成方式。但是很多API要使用多个服务器来实现,这样才能处理众多客户端生成的大量请求,并且来自同一客户端的请求可能被路由到不同的服务器上,因此它们都需要使用相同的密钥。否则,在一台服务器上生成的令牌会被另一台服务器认为是无效的,因为密钥不同。即便是只使用一台服务器,如果曾重启过,那么重启之前发出的请求也会被拒绝,除非密钥没有变。因此,可以将密钥存储在一个外部密钥库中,所有的服务器都可以加载。

HMAC和JWT

1:HMAC(AK/SK) 是一种认证方式,相较于传统的传输账户密码,它避免了密码的传输,并且因为有加密,时间等因素存在。避免了数据串改,重放攻击等问题。AK其实就是用户名,用来标识调用API者的身份。SK是秘钥,用来加密,通过对比加密结果,来判断SK是否对的上。
2:JWT是凭证的一种,相较于简单的TOKEN,可以理解其是一种复杂的TOKEN,TOKEN本身通过解密可以获取用户信息。比如 用户张三,29岁。我编码后是 ASDASDASDA,这个TOKEN解密后能还原张三,29岁这样的信息。

在实际应用中,比如我们去调用腾讯的接口,我们先要通过AK/SK完成认证,也就是告诉腾讯,我们是XXX!如果腾讯在数据库里找到了你的信息,你就认证通过了。这个时候我们可以访问一些公共的资源,或者属于开发者的资源!
但是如果你要访问腾讯其他用户的资料,则需要获取用户的授权。比如老王要授权你去读取它QQ空间的照片。这里通过OAUTH2.0完成授权获取token。 这个TOKEN就是你获取授权的一个凭证,你可以拿来读取老王的照片!
认证解决的是身份辨识的问题,知道谁在调用接口!
授权解决的是权限的问题,知道你能调哪些接口。(对于默认开放的借口,也可以不要授权)
token是凭证,JWT又是生成token的一种具体方法。

HMAC主要应用在身份认证中,使用方法如下:(随机值作为密钥)
(1)客户端发出登录请求(假设是浏览器的GET请求)。
(2)服务器返回一个随机值,并在会话中记录这个随机值。
(3)客户端将该随机值作为密钥,对用户密码进行HMAC运算,然后提交给服务器。
(4)服务器读取用户数据库中的用户密码和(2)中发送的随机值,做与客户端一样的HMAC运算,然后与用户发送的结果比较,如果结果一致,就验证用户合法。
在这个过程中,可能遭到安全攻击的是服务器发送的随机值和用户发送的HMAC结果,而对于截获了这两个值的黑客而言,这两个值是没有意义的,绝无获取用户密码的可能性。随机值的引入,使HMAC只在当前会话中有效,大大增强了安全性和实用性。大多数的语言都实现了HMAC算法,比如PHP的mhash、Python的hmac.py、Java的MessageDigest类,在Web验证中使用HMAC也是可行的,用JS进行md5运算的速度也是比较快的。

我们可以描述HMAC算法的运算步骤:
(1)检查密钥K的长度。如果K的长度大于B,则先使用摘要算法计算出一个长度为L的新密钥。如果K的长度小于B,则在后面追加0使其长度达到B。
(2)将上一步生成的B字长的密钥字符串与ipad做异或运算。
(3)将需要处理的数据流text填充至步骤(2)的结果字符串中。
(4)使用哈希函数H计算上一步中生成的数据流的信息摘要值。
(5)将步骤(1)生成的B字长密钥字符串与opad做异或运算。
(6)将步骤(4)得到的结果填充到步骤(5)的结果之后。
(7)使用哈希函数H计算上一步中生成的数据流的信息摘要值,输出结果就是最终的HMAC值。由上述描述过程我们知道HMAC算法的计算过程实际是对原文做了两次类似于加盐处理的哈希过程。在应用中,出于安全的考虑和数据的保密,需要使用加密算法,有时为了让加密的结果更加扑朔迷离,常常会给被加密的数据加点“盐”。说白了,盐就是一串数字,完全是自己定义的。

上一篇 下一篇

猜你喜欢

热点阅读