加密通过 HTTPS 发送的密码
Encryption of a Password send over HTTPS
美好的一天,
我对 database/application/connection 安全还很陌生,想在项目上得到一些帮助。
让我解释一下我的环境:
- 我将用户名 A 和密码 A 保存在本地计算机的数据库 (A) 中。
- 正在使用一种带有盐 A 的哈希算法存储密码 A。
- 我正在通过 HTTPS SOAP 调用将凭据(用户名 A 和密码 A)发送到远程网络服务。
- Apon 收到用户名 A 和密码 A,web 服务将这些凭据验证到位于 web 服务位置本地的数据库 (B) 中的 table。
我的问题: 如果有人可以访问数据库 A 并提取哈希密码,他们可以使用 SOAP 请求连接到网络服务。这意味着我的安全性无效且作废。
我有可能的解决方案:
解决方案 1:在将密码 A 发送到 Web 服务之前,我对其进行解密并通过安全 HTTPS 连接以明文形式发送。当再次验证存储在数据库 B 中的哈希值时,Web 服务将再次对其进行加密。
解决方案 2:在将密码 A 发送到网络服务之前,我对该现有哈希进行了第二次加密。当到达 web 服务时,它被解密以公开散列,然后针对数据库 B 进行验证。
我的问题:是上面两种解决方案中的任何一种,最佳实践。如果没有,什么是这种情况的最佳实践解决方案。
亲切的问候
如果您使用的是基于 xml 的 SOAP,您可以使用 WS-Security 来加密密码并签署您的请求数据,以确保密码的完整性和安全性,并通过 https 发送数据.
为了存储密码,您应该使用像 sha2 这样的不可逆加密哈希,在服务器上您将解密密码,创建 sha2 哈希并将其与数据库中的哈希相匹配
几个笔记
- 散列(单向,不可逆)和加密(可逆)之间存在差异。您无法解密散列值。
- 我假设您使用的是服务凭证,而不是用户的身份凭证
这里我假设你在谈论
SOLUTION 2 : Before sending password A to the webservice, I do a second encryption to that existing hash. When arriving at the webservice, it is decrypted to expose the hash which is .then validated against database B.
哈希实际上变成了密码,它不会为解决方案增加任何安全性
SOLUTION 1 : Before sending password A to the webservice, I decrypt it and send it over plaintext via the Secured HTTPS connection.
有几种标准可以使用简单的凭据 WS-UsernameToken 对 SOAP WS 客户端进行身份验证。实际上,客户端发送其用户名和密码,依靠 HTTPS 来处理通道安全。
My Problem : If someone gets access to database A and extracts the hashed passwords they can use a SOAP request to connect to the webservice
密码经过哈希处理后,您将无法解密它,但您也不能将哈希值用作密码。否则你会得到 "solution 2" 并且你正在使用散列作为密码。
的确,这通常是一个问题。您可以搜索其他问题,如何在本地存储服务凭证。整个问题是 - 您需要存储凭据。根据我的经验,你能做的最好的事情至少会让检索变得更难,例如加密服务密码,这样它们就不会明文存储在数据库或配置文件中。最后,客户端应用程序需要某处的加密密钥来解密凭据。密钥也需要保护。
如果您正在处理用户凭据(用户身份),则根本不要在客户端存储用户密码,还有其他方法可以授权用户操作(访问令牌、jwt 令牌、..)
美好的一天,
我对 database/application/connection 安全还很陌生,想在项目上得到一些帮助。
让我解释一下我的环境:
- 我将用户名 A 和密码 A 保存在本地计算机的数据库 (A) 中。
- 正在使用一种带有盐 A 的哈希算法存储密码 A。
- 我正在通过 HTTPS SOAP 调用将凭据(用户名 A 和密码 A)发送到远程网络服务。
- Apon 收到用户名 A 和密码 A,web 服务将这些凭据验证到位于 web 服务位置本地的数据库 (B) 中的 table。
我的问题: 如果有人可以访问数据库 A 并提取哈希密码,他们可以使用 SOAP 请求连接到网络服务。这意味着我的安全性无效且作废。
我有可能的解决方案:
解决方案 1:在将密码 A 发送到 Web 服务之前,我对其进行解密并通过安全 HTTPS 连接以明文形式发送。当再次验证存储在数据库 B 中的哈希值时,Web 服务将再次对其进行加密。
解决方案 2:在将密码 A 发送到网络服务之前,我对该现有哈希进行了第二次加密。当到达 web 服务时,它被解密以公开散列,然后针对数据库 B 进行验证。
我的问题:是上面两种解决方案中的任何一种,最佳实践。如果没有,什么是这种情况的最佳实践解决方案。
亲切的问候
如果您使用的是基于 xml 的 SOAP,您可以使用 WS-Security 来加密密码并签署您的请求数据,以确保密码的完整性和安全性,并通过 https 发送数据.
为了存储密码,您应该使用像 sha2 这样的不可逆加密哈希,在服务器上您将解密密码,创建 sha2 哈希并将其与数据库中的哈希相匹配
几个笔记
- 散列(单向,不可逆)和加密(可逆)之间存在差异。您无法解密散列值。
- 我假设您使用的是服务凭证,而不是用户的身份凭证
这里我假设你在谈论
SOLUTION 2 : Before sending password A to the webservice, I do a second encryption to that existing hash. When arriving at the webservice, it is decrypted to expose the hash which is .then validated against database B.
哈希实际上变成了密码,它不会为解决方案增加任何安全性
SOLUTION 1 : Before sending password A to the webservice, I decrypt it and send it over plaintext via the Secured HTTPS connection.
有几种标准可以使用简单的凭据 WS-UsernameToken 对 SOAP WS 客户端进行身份验证。实际上,客户端发送其用户名和密码,依靠 HTTPS 来处理通道安全。
My Problem : If someone gets access to database A and extracts the hashed passwords they can use a SOAP request to connect to the webservice
密码经过哈希处理后,您将无法解密它,但您也不能将哈希值用作密码。否则你会得到 "solution 2" 并且你正在使用散列作为密码。
的确,这通常是一个问题。您可以搜索其他问题,如何在本地存储服务凭证。整个问题是 - 您需要存储凭据。根据我的经验,你能做的最好的事情至少会让检索变得更难,例如加密服务密码,这样它们就不会明文存储在数据库或配置文件中。最后,客户端应用程序需要某处的加密密钥来解密凭据。密钥也需要保护。
如果您正在处理用户凭据(用户身份),则根本不要在客户端存储用户密码,还有其他方法可以授权用户操作(访问令牌、jwt 令牌、..)