Web API BasicHttpAuth 密码散列
Web API BasicHttpAuth with hashed password
所以我有一个 Web Api 可以通过用户名和密码对用户进行身份验证。与 API 通话的客户将 android 具有内部应用程序的手机从 api.
获取/发送一些数据
我在数据库中用盐对密码进行了哈希处理。客户端和 API 之间的连接将是 SSL。
现在在网站 (MVC) 上,我通过生成新哈希并将其与数据库中的哈希进行匹配来登录用户。
部分 android 设备将有一个配置文件,将应用程序锁定到特定用户。现在我不想在设备上以明文形式存储密码,而是想加密密码。
现在的问题是比较散列密码的最佳做法是什么。我不认为将纯密码发送到 API 是不是省事?
很安全,因为您使用的是 SSL。
纯文本请求不接受基本身份验证,但由于 HTTPS 加密了所有内容,因此这应该不是问题。
正如您所指出的,存储密码是一个完全独立的问题,它也应该加密,这听起来像您 Android 为您做的。唯一的考虑是您必须进行可逆加密才能将密码本身发送到您的 API.
基本上:
- (客户端)用户输入凭据
- (客户端)加密凭证,存储在配置中
- (客户端)从配置中读取,解密信用
- (客户端)将 HTTPS 请求发送到 API,使用基本身份验证类型,使用解密的凭据
- (服务器端)哈希(基本上是单向加密)密码,与数据库进行比较
这听起来和你所得到的完全一样,我看不出有什么问题。
综上所述,就其价值而言,我很想 implement an OAuth 2.0 server 用于此特定用例,因此您根本不必考虑保留密码。这是一项相当大的任务(有点——这些说明不会花太长时间),您应该根据具体情况对其进行评估。但每当我不得不担心 API 身份验证时,我通常会选择这样做,或者希望我有。
我会考虑使用 JWT(JSON Web 令牌,http://jwt.io)之类的东西。您可以让客户端根据您的 API 进行身份验证,如果他们提供正确的凭据,您可以向他们颁发令牌,他们可以将令牌保留在本地存储中。然后,他们将在任何需要身份验证的 API 请求的 header 中提供此令牌。您可以使用 OWIN 中间件拦截请求,check/validate 令牌,如果您认为令牌有效,则让请求通过您的控制器。
所以我有一个 Web Api 可以通过用户名和密码对用户进行身份验证。与 API 通话的客户将 android 具有内部应用程序的手机从 api.
获取/发送一些数据我在数据库中用盐对密码进行了哈希处理。客户端和 API 之间的连接将是 SSL。
现在在网站 (MVC) 上,我通过生成新哈希并将其与数据库中的哈希进行匹配来登录用户。
部分 android 设备将有一个配置文件,将应用程序锁定到特定用户。现在我不想在设备上以明文形式存储密码,而是想加密密码。
现在的问题是比较散列密码的最佳做法是什么。我不认为将纯密码发送到 API 是不是省事?
很安全,因为您使用的是 SSL。
纯文本请求不接受基本身份验证,但由于 HTTPS 加密了所有内容,因此这应该不是问题。
正如您所指出的,存储密码是一个完全独立的问题,它也应该加密,这听起来像您 Android 为您做的。唯一的考虑是您必须进行可逆加密才能将密码本身发送到您的 API.
基本上:
- (客户端)用户输入凭据
- (客户端)加密凭证,存储在配置中
- (客户端)从配置中读取,解密信用
- (客户端)将 HTTPS 请求发送到 API,使用基本身份验证类型,使用解密的凭据
- (服务器端)哈希(基本上是单向加密)密码,与数据库进行比较
这听起来和你所得到的完全一样,我看不出有什么问题。
综上所述,就其价值而言,我很想 implement an OAuth 2.0 server 用于此特定用例,因此您根本不必考虑保留密码。这是一项相当大的任务(有点——这些说明不会花太长时间),您应该根据具体情况对其进行评估。但每当我不得不担心 API 身份验证时,我通常会选择这样做,或者希望我有。
我会考虑使用 JWT(JSON Web 令牌,http://jwt.io)之类的东西。您可以让客户端根据您的 API 进行身份验证,如果他们提供正确的凭据,您可以向他们颁发令牌,他们可以将令牌保留在本地存储中。然后,他们将在任何需要身份验证的 API 请求的 header 中提供此令牌。您可以使用 OWIN 中间件拦截请求,check/validate 令牌,如果您认为令牌有效,则让请求通过您的控制器。