如何在Python和SQLite中存储,验证和使用密钥进行加密/解密

时间:2019-08-12 02:46:57

标签: python sqlite cryptography pycrypto hashlib

简介:我正在尝试通过使用Python和SQLite编写一个简单的本地密码管理器来练习Python和Crypto。问题在注册期间开始。用户使用SHA256哈希1次后,输入一个我保存在SQLite中表中的主密码。在登录期间,我将登录时间设置为Password,然后使用SHA256重新哈希,然后将两者进行比较。如果匹配,我登录。现在,无论用户加密或解密什么数据,都可以使用存储在数据库中的相同密码哈希来完成。 顺便说一下,我正在使用AES进行加密/解密。 现在,SQLITE没有默认的安全措施,因此任何有权访问数据库的人都可以简单地使用哈希密码来解密所有数据,因为密码本身也是KEY。他们甚至不需要强行/彩虹出局密码。 我发现,我必须使用“密钥扩展”和PBKDF2来生成用于加密/解密的“密钥”或“多个密钥”。

现在,我一直在尝试这样做,但没有好运。我所要做的就是使用PBDKF2生成超级安全的HASH,但是我该如何从中派生Enc / Dec密钥呢?如果我对enc / dec使用相同的密钥,那么,如果结果本身就是用于Enc / Dec的主密钥,则无需使用该算法并在hmac上运行hmac。甚至没有人需要扭转这种情况。我还听说PBDFK2可以从可用于enc / dec的主密钥中生成辅助密钥,但是我已经深入研究了pycryprpto,cryptodome官方文档,却从未真正了解过如何做。 即使我认为这是可能的事实,PBKDF的魔力在于将盐和hmacing随机化,因此,同一组字符串的返回值永远不会返回相同的值。那么,即使我如何验证登录时间密码哈希值是否等于保存的密码哈希值呢? 。 我尝试的第二件事是,通过提供相同的盐来检查登录时间和数据库保存的哈希,即使它们是正确的,我应该使用16或24或32字节密钥来实际加密和解密数据吗? 我对此无处研究。 。 。 。 也有一个reddit版本。如果有帮助: https://www.reddit.com/r/learnprogramming/comments/cken8f/how_to_securely_store_a_master_password_hash_onto/

1 个答案:

答案 0 :(得分:0)

要满足您的需求,您可以使用已知密码管理器提供的示例,例如KeePass(请参阅https://keepass.info/help/base/security.html)。

您已经有一个元素:主密钥,直接从密码中派生(或(例如)其他元素)。 使用密钥派生算法来生成加密密钥,可以使检索数据库内容变得更加困难(舍入越多越好,例如,参见HKDF)。

但是,您会发现这可能是不足的保护,这就是KeePass还提供KeyFile的原因,如How does a key file increase the security of a password manager?

中所述