restapi密钥生成策略

restapi密钥生成策略,api,rest,authentication,jax-rs,Api,Rest,Authentication,Jax Rs,我需要为使用JAX-RS标准实现的RESTAPI提供授权和身份验证,这些API将从移动客户端和一些设备中使用。我有多个具有唯一设备标识的设备,可以发布一些数据。移动客户端只是使用GET请求来显示数据。我更关心POST部分,在那里我想验证客户端。另外,我想保持简单。我正在考虑通过HTTPS使用一个简单的HTTP基本授权,并带有一个API密钥。我的问题是如何生成这个API密钥?您可以看看Shiro:它是一个非常好的框架,可以“保护”API(授权、身份验证和其他安全方面的东西)。您可以实现“基本身份验

我需要为使用JAX-RS标准实现的RESTAPI提供授权和身份验证,这些API将从移动客户端和一些设备中使用。我有多个具有唯一设备标识的设备,可以发布一些数据。移动客户端只是使用GET请求来显示数据。我更关心POST部分,在那里我想验证客户端。另外,我想保持简单。我正在考虑通过HTTPS使用一个简单的HTTP基本授权,并带有一个API密钥。我的问题是如何生成这个API密钥?

您可以看看Shiro:它是一个非常好的框架,可以“保护”API(授权、身份验证和其他安全方面的东西)。您可以实现“基本身份验证”来“登录”您的用户(通过用户名/密码),然后向他们提供API密钥,您可以使用该密钥执行“承载令牌身份验证”,以允许他们访问API的资源。为此,您需要定义shiro所称的“过滤器”,这些过滤器是通过API资源定义的。。。这在“shiro.ini”中定义如下:

[main]
authcBasicRealm = com.yourapp.shiro.UserAuthenticatorRealm
tokenValidatorFilter = com.yourapp.shiro.BearerAuthenticationTokenFilter
tokenValidatorRealm = com.yourapp.shiro.BearerAuthenticationTokenRealm

[urls]
/rest/hello/login/** = ssl[8443], noSessionCreation, authcBasic
/rest/hello/hello = ssl[8443], noSessionCreation, tokenValidatorFilter
您需要实现/扩展一些Shiro默认过滤器,使其与您的DB一起工作,以获取用户身份验证数据等。好处是,它们提供了许多工具来处理安全问题,例如:生成API密钥、salt和加密等。看看它们的教程,它们通常都非常好

还有其他框架,即JavaEE支持安全性,Spring也支持安全性。看看Mat Raible的这篇非常好的演讲,他在演讲中介绍并演示了这三个框架:

您可以使用一个。UUID如下所示:

550e8400-e29b-41d4-a716-446655440000

在每种编程语言中都有生成UUID的库。

找到了一些不错的文章,消除了我对生成API密钥和使用它们进行身份验证的疑虑:


我也在研究这个问题,如果我想依赖JAX-RS标准并保持应用程序的“纯”,我会使用容器附带的默认身份验证系统(通常是基本身份验证)

这意味着容器需要执行身份验证和课程级授权,就像Java EE应用程序一样,遵循标准,而不是构建解决方案(即使用Shiro)

但是,如果您想使用API令牌之类的概念,同时不让应用程序实现身份验证系统,则需要在其他地方(即容器)实现该工作

不幸的是,基于容器的身份验证必须是特定于容器的。JAAS没有描述标准的容器API来进行身份验证。甚至他们的教程也讨论了Glassfish特定的配置

如果您的组织足够大,DataPower还支持OAuth,因此您可能可以使用它来管理身份验证并将适当的凭据传递给应用程序。然而。您仍然需要做一些特定于供应商的事情


但这并不是一件坏事,我宁愿采用这种方法,也不愿用自己的身份验证系统污染应用程序,从而在身份验证系统发生变化时使事情变得不灵活。e、 g.SonarQube有自己的身份验证系统,不支持客户端证书。

我不想使用其他框架来实现安全性。不过,还是谢谢你。我明白。。。但是,如果您想管理web服务中所有这些不同方面的安全性(HTTPS上的基本授权,然后生成密钥并将其提供给用户,然后对密钥进行身份验证,等等),您可能会执行我自己介绍的操作类型。。。因为我不是安全专家,所以我避免自己这么做,我更喜欢依赖一个设计来处理这些事情的框架。Java EE、Spring也有框架/库来处理安全问题,如果您使用其中一个框架/库(我更新了我的答案),那么服务器如何知道客户端生成了什么UUID,反之亦然?好的,现在我问,我该如何分发密钥?UUID只有128位,并且取决于生成方法,它们的生成方式可能存在一些模式,而漏洞利用可以利用这些模式。另一种方法是使用bouncycastle生成客户端证书供用户登录,我正在考虑,但不确定该方法如何工作(这就是为什么我没有将其添加为答案)。