Security 如何从一个字符串中获取两个独立的密码?

Security 如何从一个字符串中获取两个独立的密码?,security,language-agnostic,encryption,passwords,Security,Language Agnostic,Encryption,Passwords,我不确定标题是否准确,如果合适,请随意重命名问题 我正在考虑在远程服务器上存储敏感数据的服务。为了最大限度地保护隐私,将使用AES在客户端对数据进行加密,并且加密密钥不会存储在任何地方,因此,如果服务器受到威胁,敏感数据仍将相对安全 现在的问题是,我需要第二个密码来访问该服务,但第二个密码必须存储在服务器上的某个位置 这就是用户注册时发生的情况: 用户选择用户名/密码a和加密密钥密码B。 hashPassword存储在服务器上 密码B未存储在任何位置。 然后: 用户输入密码A=>将密码A传输到服

我不确定标题是否准确,如果合适,请随意重命名问题

我正在考虑在远程服务器上存储敏感数据的服务。为了最大限度地保护隐私,将使用AES在客户端对数据进行加密,并且加密密钥不会存储在任何地方,因此,如果服务器受到威胁,敏感数据仍将相对安全

现在的问题是,我需要第二个密码来访问该服务,但第二个密码必须存储在服务器上的某个位置

这就是用户注册时发生的情况:

用户选择用户名/密码a和加密密钥密码B。 hashPassword存储在服务器上 密码B未存储在任何位置。 然后:

用户输入密码A=>将密码A传输到服务器 服务器根据用户数据库检查HashA密码,授予访问权限 客户端下载首选项和加密数据 用户输入密码B->加密数据在本地解密。 这看起来不错,但缺点是用户需要两个不同的密码。这是不切实际的,同时也带来了用户为两者选择相同字符串的风险,大大降低了模型的有效性

我希望使用两个独立的密码,但只向用户询问一个

第一次尝试 我的第一个想法是向用户询问密码,然后将其一分为二,使用第一部分作为服务凭据密码a,而第二部分是加密密钥密码B

这有降低密码强度的缺点:如果用户提供的字符串已经很弱/很短,则密码A和密码B将更弱

第二次尝试 另一个选项:使用用户提供的密码作为加密密钥密码B,并使用该密码的哈希SHA-256作为服务凭据

注册:

用户选择一个密码通行证 hashPASS被传输到服务器 服务器将用户名为的hashpass存储在用户数据库中 然后:

用户输入密码 服务向服务器发送密码A=hashPASS 服务器根据用户数据库检查HashA密码,授予访问权限 客户端下载首选项和加密数据 客户端使用密码B=PASS解密加密数据。 这意味着

加密密码的散列在网络2上传播 哈希加密密钥现在存储在服务器上,即与加密数据一起 这是否会显著降低系统的安全性?即,当攻击者获得对服务器的访问权限时,在知道哈希加密密钥的情况下解密敏感数据是否更容易

有没有其他更好的方法从一个字符串开始获取两个独立的密码?

如果我没记错,请使用此系统:

用户输入电子邮件地址和密码 密码被散列,散列用作加密用户敏感数据的密钥 密码散列+电子邮件散列为第二个密码,用于登录服务器并上载加密的数据blob 我可能会把它倒过来,哪个哈希用于哪个,但听起来你想要的东西非常相似。如果您感兴趣,整个过程已在中详细解释。

如果我没记错,请使用此系统:

用户输入电子邮件地址和密码 密码被散列,散列用作加密用户敏感数据的密钥 密码散列+电子邮件散列为第二个密码,用于登录服务器并上载加密的数据blob
我可能会把它倒过来,哪个哈希用于哪个,但听起来你想要的东西非常相似。如果你感兴趣,整个事情都在中详细解释了。

我会采用另一种方法。使用openid对您的系统进行身份验证。这样,您根本不必向服务器发送密码


在第一种方法中,您应该只传输散列

我会采取另一种方法。使用openid对您的系统进行身份验证。这样,您根本不必向服务器发送密码


在第一种方法中,您应该只传输散列

正如@Tim在其回答中所建议的那样-不要创建新的用户身份验证方案—您自己的用户id和密码组合

根据您构建此应用程序的目的,您基本上有两个选项:

如果这在公司内部应用程序中,只需集成到Active Directory或您拥有的任何内部用户数据库和身份验证后端 如果这是公开的,如果您只需要身份验证或还需要授权,请使用。 请注意,您的应用程序不必基于web才能使用它们。不过,你确实需要上网。有关详细信息,请参阅

对于加密密钥,使用某种也称为PRF+的方法进行密钥派生-最好与其他组件一起使用。向PRF/KDF馈送例如以下连接:

用户的唯一i 验证者的身份证明,广告,随便什么 系统范围的应用程序标识符字符串,例如Francescos secureapp键盘 与用户信息一起存储的每用户随机数据,例如来自系统随机源的16字节 用户的加密密码-这是您必须关心的唯一密码。 这有点类似于中的AUTH有效负载计算

通过这种方式,潜在的攻击者需要从不同的位置访问信息位,以便能够解密用户的敏感数据

另外,不要将用户的加密密码存储在服务器端。客户机应始终从用户处请求或缓存一定时间,并在请求需要[en | de]加密的内容时,通过加密通道以明文或哈希方式发送给服务器


此外,如果您想在加密密码上实施某种密码策略,请参见此内容并参考如何执行。

正如@Tim在其回答中所建议的那样-不要创建新的用户身份验证方案—您自己的用户id和密码组合

根据您构建此应用程序的目的,您基本上有两个选项:

如果这在公司内部应用程序中,只需集成到Active Directory或您拥有的任何内部用户数据库和身份验证后端 如果这是公开的,如果您只需要身份验证或还需要授权,请使用。 请注意,您的应用程序不必基于web才能使用它们。不过,你确实需要上网。有关详细信息,请参阅

对于加密密钥,使用某种也称为PRF+的方法进行密钥派生-最好与其他组件一起使用。向PRF/KDF馈送例如以下连接:

来自身份验证器的用户唯一标识符,AD,等等 系统范围的应用程序标识符字符串,例如Francescos secureapp键盘 与用户信息一起存储的每用户随机数据,例如来自系统随机源的16字节 用户的加密密码-这是您必须关心的唯一密码。 这有点类似于中的AUTH有效负载计算

通过这种方式,潜在的攻击者需要从不同的位置访问信息位,以便能够解密用户的敏感数据

另外,不要将用户的加密密码存储在服务器端。客户机应始终从用户处请求或缓存一定时间,并在请求需要[en | de]加密的内容时,通过加密通道以明文或哈希方式发送给服务器


此外,如果您想对加密密码强制执行某种密码策略,请参阅此部分并参考如何执行。

使用安全密码方案的建议是正确的。您可能想做的是在将用户文本传递给密码方案之前做一个小的更改。如果用户输入密码,则将passwordLOCAL传递给本地密码方案,将passwordREMOTE传递给远程密码方案


这允许用户输入单个密码,但仍然有两个不同的本地和远程密码。当然,不要使用本地和远程,这太不安全了。使用两个不同的随机字符串,就像两种不同的盐一样。

使用安全密码方案的建议是正确的。您可能想做的是在将用户文本传递给密码方案之前做一个小的更改。如果用户输入密码,则将passwordLOCAL传递给本地密码方案,将passwordREMOTE传递给远程密码方案


这允许用户输入单个密码,但仍然有两个不同的本地和远程密码。当然,不要使用本地和远程,这太不安全了。使用两个不同的随机字符串,就像使用两种不同的盐一样。

如果需要,您可以在服务器上生成并存储一个或两个IV,然后将其发送到客户端HMAC。这将生成所需的加密密钥。

如果需要,您可以在服务器上生成并存储一个或两个IV,然后将其发送到客户端HMAC。这会产生所需的加密密钥。

我考虑过这一点,但客户端不是基于web的,因此OpenID不太实用。我考虑过这一点,但客户端不是基于web的,因此OpenID不太实用。请注意≠ 身份验证。@Gumbo-正确,但不管名称如何,OpenID是一个身份验证协议。请注意≠ 身份验证。@Gumbo-正确,但不管名称如何,OpenID是一个身份验证协议。这是最接近我需要的。我不想使用开放ID或任何其他外部身份验证,因为首先应用程序将在完全不同的环境中运行,其次它必须脱机工作,第三它不是一个web应用程序,这使得开放ID非常不切实际。这是最接近我需要的。我不想使用开放ID或任何其他外部身份验证,因为首先应用程序将在wi上运行 ldly不同的环境,第二它必须离线工作,第三它不是一个web应用程序,使得openid非常不切实际。