【问题标题】:Web API BasicHttpAuth with hashed password带有哈希密码的 Web API BasicHttpAuth
【发布时间】:2016-05-12 09:27:29
【问题描述】:

所以我有一个通过用户名和密码对用户进行身份验证的 Web Api。与 API 对话的客户端将使用具有内部应用程序的 Android 手机,以从 API 获取/发送一些数据。

我在数据库中使用盐对密码进行了哈希处理。客户端和 API 之间的连接将是 SSL。

现在在网站 (MVC) 上,我通过生成新哈希并将其与数据库中的哈希匹配来登录用户。

某些 android 设备会有一个配置文件,将应用程序锁定给特定用户。现在我宁愿不在设备上以纯文本形式存储密码,而是希望对密码进行加密。

现在的问题是这里比较散列密码的最佳做法是什么。我不认为只需将纯密码发送到 API 即可保存,还是这样?

【问题讨论】:

  • 我现在遇到了同样的问题并找到了你的问题。我正在使用 ASP.NET 身份在网站端管理我的成员数据库,这些数据库都存储在 SQL Server 等中。然后我有一个移动应用程序使用基本身份验证与我的 MVC Web Api 交谈,所以它需要传递用户名和密码穿过。我不想在移动设备上存储纯文本密码。能够以与 ASP.Net Identity 相同的方式对其进行哈希处理,然后从移动应用程序发送该哈希并在 MVC Web API 中进行比较以进行身份​​验证,这将是非常好的。所以我不存储或发送明文

标签: asp.net encryption asp.net-web-api hash basic-authentication


【解决方案1】:

这是安全的,因为您使用的是 SSL。

对于纯文本请求,基本身份验证是不可接受的,但由于 HTTPS 会加密所有内容,所以这应该不是问题。

正如您所指出的,存储密码是一个完全独立的问题,它也应该被加密,听起来你会让 Android 为你做。唯一需要考虑的是,您必须进行可逆加密才能将密码本身发送到您的 API。

基本上:

  1. (客户端)用户输入凭据
  2. (客户端)加密凭据,存储在配置中
  3. (客户端)从配置中读取,解密凭据
  4. (客户端)使用解密的凭据向 API 提交 HTTPS 请求,使用基本身份验证类型
  5. (服务器端)哈希(基本上是单向加密)密码,与数据库进行比较

这听起来正是你所拥有的,我认为它没有问题。

总而言之,就其价值而言,对于这个特定的用例,我很想implement an OAuth 2.0 server,因此您根本不必考虑保留密码。这是一项相当大的任务(有点——这些说明不需要太长时间),您应该逐个评估它。但每当我不得不担心 API 身份验证时,我通常会选择这样做,或者希望我这样做。

【讨论】:

  • 感谢您的验证/解释。我在这里面临的问题是 API 和 MVC 应用程序在同一个项目中。我使用了单独的身份验证,并使用了教程中的基本身份验证。因为我也更喜欢 OAuth 2,所以我会花更多时间来实施 OAuth 2,因为这看起来是更好的解决方案。
  • @FlorianSchaal 够公平的。是的,OAuth 2 相当复杂,但我链接到的那个(官方)教程让它变得非常简单。还有很多关于执行 OWIN 实现的博客文章(像那样)。没有什么比基本的更容易了,但如果你愿意支持它,我认为它是值得的。特别是对于任何用于生产的东西。然后,当然,您只需在配置文件中存储访问和/或刷新令牌。仍然加密,但不那么可怕。
【解决方案2】:

我会考虑使用 JWT(JSON Web 令牌,http://jwt.io)之类的东西。您可以让客户端对您的 API 进行身份验证,如果他们提供正确的凭据,您可以向他们颁发令牌,他们可以将其保存在本地存储中。然后,他们将在任何需要身份验证的 API 请求的标头中提供此令牌。如果您认为令牌有效,您可以使用 OWIN 中间件拦截请求、检查/验证令牌并让请求通过您的控制器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-13
    • 2015-03-02
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    • 2012-07-07
    相关资源
    最近更新 更多