Encryption 保存可解密密码

Encryption 保存可解密密码,encryption,password-storage,Encryption,Password Storage,我知道有无数次这样的问题,但我无法找到符合我需要的答案 我正在为我的公司构建类似小型内部密码管理器的东西,用于存储各种服务器的登录数据等等。 当新用户注册时,他的密码将以加盐/哈希版本保存在数据库中,这样就没有人可以访问它(对于这一部分,我认为一切都没问题,如果我错了,请纠正我) 但是,当用户登录时,他可以添加带有登录详细信息的新服务器 问题是,如何储存这些 因为,在某个时刻,我必须以纯文本的形式向用户展示这个登录详细信息(这就是这个应用程序的全部要点)。 我能想到的最好办法就是使用某种对称加密

我知道有无数次这样的问题,但我无法找到符合我需要的答案

我正在为我的公司构建类似小型内部密码管理器的东西,用于存储各种服务器的登录数据等等。 当新用户注册时,他的密码将以加盐/哈希版本保存在数据库中,这样就没有人可以访问它(对于这一部分,我认为一切都没问题,如果我错了,请纠正我)

但是,当用户登录时,他可以添加带有登录详细信息的新服务器

问题是,如何储存这些

因为,在某个时刻,我必须以纯文本的形式向用户展示这个登录详细信息(这就是这个应用程序的全部要点)。 我能想到的最好办法就是使用某种对称加密。 其想法是,应用程序将使用对称加密加密登录详细信息,并以这种方式将其保存到数据库中,然后当再次需要数据时,将从数据库中提取数据,用相同的密钥解密并呈现给用户(密钥应该在应用程序的源代码中?)

它可以是非对称加密,但如果公钥和私钥存储在相同的源代码中,那么使用它没有任何好处

这似乎不太安全,但我想不出比这更好的了

有没有更好的方法来存储登录数据


若它对您很重要,那个么应用程序将是PHP,数据库是Oracle,我只会使用对称加密。标准步骤是:

  • 从用户提供的密码(例如PBKDF2或scrypt)派生对称密钥
  • 使用AES-128-CBC或更好的随机密码加密数据
  • HMAC显示结果(例如HMAC_SHA256)或仅使用AES GCM模式
在数据库中存储IV+密文+MAC

这些都可以在浏览器中运行(参见crypto js和aes js)。这样,服务器就永远看不到明文密码(不确定这是否是必需的)


MAC还可以用作密码散列,即如果MAC验证失败,则意味着提供的密码不正确。

像passpack.com这样的服务只处理客户端数据的解密…如果这是您第一次处理加密,我会三思而后行,而不是购买已经存在的东西。有一些伟大的密码管理者已经对他们进行了大量的审查。这是一个很难安全实现的问题,绝对不应该是某人的第一个存储他人密码的加密项目。如果您想开始了解相关问题,我推荐1 Password关于该主题的白皮书。(我也非常喜欢1Password作为密码库,但是有很多好的产品。)买一个经过严格审查的密码管理器,不要自己使用。即使对于经验丰富的密码学家来说,获得正确的安全性也是非常困难的,加密失败的结果将暴露所有密码,这将是灾难性的。是的,这是我第一次使用这种级别的加密。第二,安全性在这里并不是一个真正的问题,因为在实际情况下,应用程序(和数据库)只有通过我们的内部网络(而不是通过互联网)才能访问,只有真正能够看到数据的用户才能访问。现在那些用户的电脑上有excel文件和密码,密码我们都知道。所以基本上,我所做的任何事情都是安全升级,而不是安全问题:)但我想尽我所能做到最好。当然,购买已经构建的解决方案更安全,但学习是我在此尝试做的。OP获得密码管理器正确安全的机会微乎其微,因此正确答案是“不要”。如果我从用户密码派生对称密钥,那么对于每台服务器,我应该为每个用户存储不同的密码?当服务器的密码更改时(更改使用所有这些密码的每个用户的密码),这似乎需要做很多工作?似乎更容易使用用户帐户访问用户可以看到的信息,并以某种方式使用应用程序加密和解密数据,所以当密码更改时,我只需更改一次即可。在这种情况下,您最好不要加密任何内容。如果服务器包含加密密钥和加密数据,那么当它被黑客攻击时,加密数据很容易被解密。这就是为什么我认为数据库有加密数据,而应用程序有加密密钥。通过这种方式,您可以访问数据库,但无法解密数据。我明白了,我认为您误解了密钥派生过程。使用相同的密码,您仍将获得相同的密钥。是减缓暴力的必要手段。这就是全部。