将密码安全地存储在数据库中

时间:2017-07-31 14:45:32

标签: security passwords password-encryption

我想开发自己的密码管理器,因为所有工具都没有我需要的功能。 ;)

我现在的问题是:

当我想要在纯文本中需要时再次解密密码时,在数据库中存储密码的好方法是什么?

2 个答案:

答案 0 :(得分:0)

如果你想安全地存储密码,你应该考虑"哈希"密码,也许是盐。考虑阅读this Wikipedia article, which covers hash and salt

但是如果您需要恢复原始文本,则需要一个密钥来加密/解密您的密码。这意味着您必须将密钥保存在代码中的某个位置,或者至少您的系统能够以某种方式恢复密钥。如果攻击者可以访问密钥的位置或应用程序的代码以及加密的密码,那么您最终可能会收到被盗密码!

无论如何,您需要回答您的问题:您可以查找simmetric或asimmetric加密,这取决于您的需求。例如,您可以循环AES,这需要一个加密/解密密钥(显然还有原始/加密文本)。你没有指定编程语言,但你可以找到很多这样做的库!

答案 1 :(得分:0)

使用现有的可信实现通常是个好主意。密码学是一个广泛而复杂的领域,它需要大量的知识来设计和实现安全的东西。一般来说,这意味着:坚持现有的a)常用算法和b)尚未破解的算法。此外,不要自己实现算法,但尽可能使用现有的,经过审核的实现。即使是专家也很容易搞砸(参见Debian weak key debacle)。

由于您希望能够再次获取纯文本,因此不能使用散列函数。这使您得到对称和非对称加密。非对称加密使用不同的密钥进行加密和解密,这对于密码管理器来说并不是您想要的。所以对称加密可能是要走的路。但这仍然留给你大量不同的算法(AES,Blowfish和Serpent仅举几例)。

选择算法后,您仍然必须实现数据库的加密和解密,理想情况是快速安全。不要自己实现,坚持一个经过验证的解决方案可能是一个好主意。 enpass密码管理器使用SQLCipher加密sqlite数据库。 SQLCipher有一个Java API,因此在Scala中使用它不会太复杂。