我正在flask中创建一个简单的项目,这是一个可以注册和登录的简单网站。每次用户注册时,我都会将他们的用户名和密码保存在数据库中。当有人试图登录时,我会将他们输入的数据与我在数据库中的数据进行比较
现在,我想在项目中添加一个安全元素,所以我想要一种简单的方法来保护我保存在数据库中的密码。我想在数据库中保存hash(password)
而不是password
,并将用户在尝试登录时输入的哈希密码与我在数据库中的密码进行比较。这个问题是hash
每次返回不同的值,所以这个解决方案不起作用。有人能建议我如何解决这个问题,或者建议一个简单的算法来保护我的密码吗?
出于简单和安全的考虑,您只能选择一个(好吧,这是一个折衷方案(。
安全级别-1:存储密码。这很简单,但泄露的数据库会让攻击者冒充用户,并会暴露用户在其他平台上的帐户,因为(遗憾的是(太多人重复使用密码。
安全级别0:存储哈希(md5、sha1等(。泄露的数据库现在不会一次暴露所有密码,简单的密码仍然可以通过彩虹表攻击或暴力搜索来恢复。
安全级别1:加盐的哈希。对于每个用户,生成一个随机字符串(salt(,该字符串将以纯文本形式存储。然后,将其与密码连接,并存储生成的哈希。有了足够长的盐,它将免受彩虹桌的攻击或天真的蛮力。它无法对抗字典里的暴力。这就是django
和bcrypt
的作用
要处理字典暴力,请强制执行密码复杂性。不幸的是,这不是一个用户友好的解决方案。
2级及以上:
- 使用外部身份验证提供商,例如使用Google帐户登录
- 2FA(双因素身份验证,如RSA令牌、文本消息等(
- 非对称加密,如SSH中的加密(例如,基于智能卡的加密(