2

我已经做了很多研究,但我无法确定这是否是实现我需要的最佳方式。

我有一个通用的网络应用程序,我想创建一个通用的移动应用程序来配合它。为了让用户保存数据/访问用户特定的数据/等,他们必须登录,并且登录必须通过我的网络应用程序的 REST api 进行身份验证。

所以 api 有一个用于移动应用程序的私钥和一个公钥。公钥告诉我请求来自哪里(移动应用程序),私钥用作“盐”来散列查询字符串,然后当请求进入时可以在 Web 服务器上重新散列并比较有效性.

要登录,用户输入他们的用户名和密码,然后按照上述方法作为查询字符串 vars 发送。在另一端检查查询的有效性,并根据数据库检查用户名+密码对。如果登录正确,则为该用户和公钥生成一个随机的“身份验证令牌”,并将其发送回移动应用程序以在设备本地存储。

当下一个请求来自移动应用程序时,查询字符串变量之一是前面的“auth token”,它根据数据库中的“auth tokens”表检查其有效性(使用应用程序的公钥)。如果有效,则执行请求。

我的问题是,我做对了吗?这是实现我需要的最佳方式吗?最后一步似乎真的不安全,因为如果请求被拦截,公钥和身份验证令牌都是可见的。显然,请求将根据查询字符串的哈希值和另一端的私钥进行检查,这将确保请求不是来自任何恶意的地方。

还有其他步骤,或者我错过的有用的东西吗?例如,我读到还应该有一个时间戳变量,应根据请求中的 5/10 分钟时间范围检查该变量。任何超过 5/10 分钟的时间戳和请求都应该被拒绝。这很重要吗?

谢谢你。

4

1 回答 1

2

您所描述的基本上是2-legged OAuth的自制版本。您基本上可以使用许多实现。每当谈到安全相关的东西时,我都会说:如果其他人已经做过,不要重新发明轮子。许多大型网站(Twitter、Facebook、GitHub、Google 等)都在使用 OAuath,他们对 OAuth 标准进行了大量研究。所以我建议使用这些。

如果您担心您发送的消息可能被截获,您应该使用 HTTPS...如果您通过网络传递用户名和密码组合,这通常是一个好主意。

于 2012-06-09T12:15:58.330 回答