【发布时间】:2019-08-12 02:46:57
【问题描述】:
简介:我正在尝试通过使用 Python 和 SQLite 编写一个简单的本地密码管理器来练习 Python 和 Crypto。问题在注册期间开始。用户输入一个主密码,我在用 SHA256 哈希 1 次后保存在 SQLite 的表中。在登录期间,我使用登录时间密码并使用 SHA256 重新散列并比较两者。如果它们匹配,我登录。现在,无论用户加密或解密什么数据,都使用存储在数据库中的相同密码哈希来完成。 顺便说一句,我正在使用 AES 进行加密/解密。 现在 SQLITE 没有默认的安全措施,因此任何有权访问数据库的人都可以简单地使用散列密码解密所有数据,因为这也是 KEY 本身。他们甚至不必暴力破解/彩虹表密码。 我发现,我必须使用 Key Stretching 和 PBKDF2 来生成一个 KEY 或 MULTIPLE KEYS 进行加密/解密。
现在我已经尝试了好几天没有运气。我所要做的就是使用 PBDKF2 生成一个超级安全的 HASH,但是我要如何从中派生一个 Enc/Dec 密钥呢?因为如果我对 enc/dec 使用相同的密钥,那么如果结果本身就是用于 Enc/Dec 的主密钥,那么使用算法并在 hmac 上运行 hmac 就没有用了。甚至没有人需要扭转这一点。我还听说 PBDFK2 可以从我可以用于 enc/dec 的主密钥中生成辅助密钥,但我已经深入研究了 pycryprpto、cryptodome 官方文档,但从未真正了解它是如何完成的。 即使我认为这是可能的,PBKDF 的魔力是随机化 salts 和 hmac 一遍又一遍,所以永远不会返回相同字符串集的值。那么我如何验证登录时间密码哈希是否等于保存的密码哈希? . 我尝试的第二件事是,通过提供相同的盐来检查登录时间和数据库保存的哈希,即使它们是真的,我应该使用什么作为 16 或 24 或 32 字节密钥来实际加密和解密数据? 我没有在哪里研究这个。 . . . 还有一个reddit版本。如果有帮助: https://www.reddit.com/r/learnprogramming/comments/cken8f/how_to_securely_store_a_master_password_hash_onto/
【问题讨论】:
-
请将您的问题简化为基本问题并记住:几行代码可以说一千多个单词。
-
我可以用伪代码说。但问题是我应该如何/如何处理复杂的散列 pbkdf2 密钥?那么伪代码很简单。开始时->注册->用户输入主密钥-> db.save-登录时的SHA256(主密钥)->询问主密钥->将db.master密钥与sha256(user_key)进行比较->如果为真->登录。对 enc/dec 使用相同的密钥。问题 -> 由于 db 保存的哈希是关键,无需破解,只需使用哈希解密数据即可。问题,我得到回复说我需要使用 PBKDF2。那么到底怎么样?
标签: python sqlite cryptography pycrypto hashlib