【问题标题】:Encrypt personal data with a second hash from the password while already having a hash stored使用密码中的第二个哈希加密个人数据,同时已经存储了哈希
【发布时间】:2021-03-07 15:13:55
【问题描述】:

数据库如下所示:

class Users(UserMixin,db.Model):
    __tablename__ = "users"
    id = db.Column("id", db.Integer, primary_key=True)
    username = db.Column(db.String(100))
    hash_password = db.Column(db.Text)
    secret_content = db.Column(db.Text)

机密内容高度机密,我什至不希望管理员知道数据的内容。 我的想法是像这样对内容进行编码:

class Users(UserMixin,db.Model):
    __tablename__ = "users"
    id = db.Column("id", db.Integer, primary_key=True)
    username = db.Column(db.String(100))
    hash_password = db.Column(db.Text)
    secret_content = db.Column(db.Text)
    def __init__(self, username , password_hash, secret_content, key):
        cipher_suite = Fernet(key)
        self.username = username 
        self.secret_content = cipher_suite.encrypt(bytes(secret_content))
        self.hash_password = password_hash

用于加密数据的密钥对于每个用户应该是不同的。 我想通过使用 sha256 散列密码来创建密钥。 但是,哈希值已存储在用户中用于登录目的。 因此我会使用另一种哈希算法,例如 MD5。

这样做我看到的问题是,如果黑客能够找到/解密这个哈希值,那么他也能够提取真正的密码,因为那时你可以消除黑客暴力破解的很多可能性密码。

我是否有其他选择,或者我需要向用户询问第二个不相关的密码吗?

【问题讨论】:

  • 当然有办法,但是您如何将其映射到您的应用程序中?我想这是一个网络应用程序。如果用户登录,他们的密码将以明文和散列形式发送。您可以使用 PBKDF2 和不同的随机盐从密码中派生加密密钥。但是现在用户只有在登录时才能看到他们的秘密内容,因为那是服务器唯一一次拥有明文密码来派生密钥。在服务器上的多个请求上保留密钥会破坏目的。你可以在客户端用JS做密钥推导,然后在客户端解密。
  • 顺便说一句,MD5 不是现在应该使用的算法。
  • 感谢您提出 PBKDF2 确实是一个网络应用程序 但是现在假设您将“草莓”这个词加密并存储在数据库中。黑客知道您编码的单词应该是草莓,因此他会暴力破解哪些密码有资格成为原始密码,并将这些密码存储在 pw-list 中。黑客还可以访问密码的 sha256 哈希值。黑客将 sha256 应用于 pw-list 中的密码,并将其与数据库中存储的哈希值进行比较。黑客现在已经找到了密码。这种情况是否存在安全风险,还是需要很长时间才能找到?
  • PBKDF2 可以派生密钥。您在用户注册期间生成两个随机盐。一种盐与密码一起用于派生密码哈希以进行身份​​验证,另一种盐将用于与密码一起派生加密密钥。即使使用 PBKDF2,使用非常复杂或非常长的密码也很重要。 PBKDF2 和合理的密码规则集将大大降低暴力攻击成功的概率。
  • 您必须在特定的不活动超时或专用注销后包含基于服务器的会话失效,以清除加密密钥。当然可以。现在我考虑了一下,基于客户端的加密可以工作,但密码或密钥必须在会话期间保留(例如在sessionStorage 中)。当应用程序容易受到 XSS 攻击时,这些凭据是可以访问的,但对于“黑客”来说是安全的。

标签: python encryption sqlalchemy python-cryptography


【解决方案1】:

基于来自@Artjom B 的 cmets。

给钥匙加盐。 使用 PBKDF2 加密密钥以对个人数据进行编码。 用户登录时使用 sh256 加密相同的密钥。

【讨论】:

    猜你喜欢
    • 2015-10-07
    • 1970-01-01
    • 2023-04-08
    • 2017-05-30
    • 2019-03-17
    • 1970-01-01
    • 2014-12-31
    • 2011-06-20
    • 2014-08-10
    相关资源
    最近更新 更多