Skip to content

 用户密码与Python #20

@eziceice

Description

@eziceice

用户名密码是用户身份认证的关键, 它的重要性不言而喻. 通常大多数用户都会在各种应用中使用相似的密码, 一旦某一个应用的密码被破解, 很可能用户的其他应用也相对危险。通常有以下几种模式来存储和保护用户密码.

  • 密码明文直接存储中字系统中: 这种方法下的密码安全性比系统本身还低, 管理员能查看所有用户的密码明文. 除非你要盗取用户密码, 否则不能使用这种方式.

  • 密码明文经过转换后再存储: 与直接存储明文的方式区别不大, 任何知道或破解转换方法的人都可以逆转得到密码明文.

  • 密码经过对称加密后再储存: 密码明文的安全性等同于加密密钥本身的安全性. 对称加密的密钥可同时用于加密和解密. 一般它会直接出现在加密代码中, 破解的可能性相当大. 而且一般系统管理员很可能知道密钥, 进而算出密码原文.

  • 密码经过非对称加密后再储存: 密码的安全性等同于私钥的安全性. 密码明文经过公钥加密. 要还原密码明文, 必须要相应的私钥才行. 因此只要保证私钥的安全, 密码明文就安全. 私钥可以由某个受信任的人活着机构来掌管, 身份验证只需要公钥就可以了. 实际上,这就是HTTPS/SSL的理论基础. 这里的关键是私钥的安全, 如果私钥泄露, 那么密码明文就危险了.

因此,密码最好是以不可还原明文的方式来保存. 通常利用哈希算法的单向性来保证明文以不可以还原的有损方式进行存储. 安全性由低到高依次为:

  • 使用自己独创的哈希算法对密码进行哈希, 存储哈希过的值. - 独创对理论要求很高, 通常不建议.

  • 使用MD5或SHA-1哈希算法 - MD5和SHA-1已经被破解. 虽然不能还原明文, 但很容易找到能生成相同哈希值的替代明文, 而且这两个算法速度较快, 暴力破解相对省时, 建议不使用.

  • 使用更加安全的SHA-256等成熟算 - 更加复杂的算法增加了暴力破解的难度. 但是如果遇到简单的密码, 用彩虹字典的暴力破解法, 也很快可以找到密码原文.

  • 加入随机salt的哈希算法 - 密码原文(或经过hash后的值)和随机生成的salt字符串混淆, 然后再进行hash, 最后把hash值和salt值一起存储. 验证密码的时候只要用salt再与密码原文做一次相同步骤的运算, 比较结果与存储的hash值就可以了. 这样一样哪怕是简单的密码, 进行salt混淆后产生的也是很不常见的字符串, 根本不会出现在彩虹字典中. salt越长暴力破解难度越大. 具体的hash过程也可以进行若干次的迭代, 虽然迭代会增加碰撞概率, 但也增加暴力破解的资源消耗. 就算真破解了, 黑客掌握的也只是这个随机salt混淆过的密码, 用户的原始密码依然安全.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions