`
neo
  • 浏览: 265513 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

如何安全的存储密码

 
阅读更多

过去一段时间来,众多的网站遭遇用户密码数据库泄露事件,这甚至包括顶级的互联网企业–NASDQ上市的商务社交网络Linkedin,国内诸如CSDN一类的就更多了。 

  层出不穷的类似事件对用户会造成巨大的影响,因为人们往往习惯在不同网站使用相同的密码,一家“暴库”,全部遭殃。 

  那么在选择密码存储方案时,容易掉入哪些陷阱,以及如何避免这些陷阱?我们将在实践中的一些心得体会记录于此,与大家分享。 



  菜鸟方案: 

  直接存储用户密码的明文或者将密码加密存储。 

  曾经有一次我在某知名网站重置密码,结果邮件中居然直接包含以前设置过的密码。我和客服咨询为什么直接将密码发送给用户,客服答曰:“减少用户步骤,用户体验更好”;再问“管理员是否可以直接获知我的密码”, 客服振振有词:“我们用XXX算法加密过的,不会有问题的”。 殊不知,密码加密后一定能被解密获得原始密码,因此,该网站一旦数据库泄露,所有用户的密码本身就大白于天下。 

  以后看到这类网站,大家最好都绕道而走,因为一家“暴库”,全部遭殃。 

  入门方案: 



  将明文密码做单向哈希后存储。 

  单向哈希算法有一个特性,无法通过哈希后的摘要(digest)恢复原始数据,这也是“单向”二字的来源,这一点和所有的加密算法都不同。常用的单向哈希算法包括SHA-256,SHA-1,MD5等。例如,对密码“passwordhunter”进行SHA-256哈希后的摘要(digest)如下: 
“bbed833d2c7805c4bf039b140bec7e7452125a04efa9e0b296395a9b95c2d44c” 

  可能是“单向”二字有误导性,也可能是上面那串数字唬人,不少人误以为这种方式很可靠, 其实不然。 

  单向哈希有两个特性: 

  1)从同一个密码进行单向哈希,得到的总是唯一确定的摘要 

  2)计算速度快。随着技术进步,尤其是显卡在高性能计算中的普及,一秒钟能够完成数十亿次单向哈希计算 

  结合上面两个特点,考虑到多数人所使用的密码为常见的组合,攻击者可以将所有密码的常见组合进行单向哈希,得到一个摘要组合,然后与数据库中的摘要进行比对即可获得对应的密码。这个摘要组合也被称为rainbow table。 

  更糟糕的是,一个攻击者只要建立上述的rainbow table,可以匹配所有的密码数据库。仍然等同于一家“暴库”,全部遭殃。以后要是有某家厂商宣布“我们的密码都是哈希后存储的,绝对安全”,大家对这个行为要特别警惕并表示不屑。有兴趣的朋友可以搜索下,看看哪家厂商躺着中枪了。 

  进阶方案: 



  将明文密码混入“随机因素”,然后进行单向哈希后存储,也就是所谓的“Salted Hash”。 

  这个方式相比上面的方案,最大的好处是针对每一个数据库中的密码,都需要建立一个完整的rainbow table进行匹配。 因为两个同样使用“passwordhunter”作为密码的账户,在数据库中存储的摘要完全不同。 

  10多年以前,因为计算和内存大小的限制,这个方案还是足够安全的,因为攻击者没有足够的资源建立这么多的rainbow table。 但是,在今日,因为显卡的恐怖的并行计算能力,这种攻击已经完全可行。 

  专家方案: 



  故意增加密码计算所需耗费的资源和时间,使得任何人都不可获得足够的资源建立所需的rainbow table。 

  这类方案有一个特点,算法中都有个因子,用于指明计算密码摘要所需要的资源和时间,也就是计算强度。计算强度越大,攻击者建立rainbow table越困难,以至于不可继续。 

  这类方案的常用算法有三种: 

  1)PBKDF2(Password-Based Key Derivation Function) 

  PBKDF2简单而言就是将salted hash进行多次重复计算,这个次数是可选择的。如果计算一次所需要的时间是1微秒,那么计算1百万次就需要1秒钟。假如攻击一个密码所需的rainbow table有1千万条,建立所对应的rainbow table所需要的时间就是115天。这个代价足以让大部分的攻击者忘而生畏。 

  美国政府机构已经将这个方法标准化,并且用于一些政府和军方的系统。 这个方案最大的优点是标准化,实现容易同时采用了久经考验的SHA算法。 

  2) bcrypt 

  bcrypt是专门为密码存储而设计的算法,基于Blowfish加密算法变形而来,由Niels Provos和David Mazières发表于1999年的USENIX。 

  bcrypt最大的好处是有一个参数(work factor),可用于调整计算强度,而且work factor是包括在输出的摘要中的。随着攻击者计算能力的提高,使用者可以逐步增大work factor,而且不会影响已有用户的登陆。 

  bcrypt经过了很多安全专家的仔细分析,使用在以安全著称的OpenBSD中,一般认为它比PBKDF2更能承受随着计算能力加强而带来的风险。bcrypt也有广泛的函数库支持,因此我们建议使用这种方式存储密码。 

  3) scrypt 

  scrypt是由著名的FreeBSD黑客 Colin Percival为他的备份服务 Tarsnap开发的。 

  和上述两种方案不同,scrypt不仅计算所需时间长,而且占用的内存也多,使得并行计算多个摘要异常困难,因此利用rainbow table进行暴力攻击更加困难。scrypt没有在生产环境中大规模应用,并且缺乏仔细的审察和广泛的函数库支持。但是,scrypt在算法层面只要没有破绽,它的安全性应该高于PBKDF2和bcrypt。

分享到:
评论

相关推荐

    密码存储工具测试版Beta

    标题中的“密码存储工具测试版Beta”表明这是一个用于安全存储密码的应用程序的早期版本,旨在帮助用户管理和保护他们的各种账号密码。在当前的网络安全环境中,密码管理器是至关重要的,因为人们往往需要记住多个...

    2024高安全个人密码本程序源码 可生成随机密码/备忘录/二代密码

    除了密码之外,你还可以存储银行账号、信用卡信息、安全问题答案等敏感资料,并同样采用加密方式存储。这样一来,所有重要信息都在一个安全的地方,方便查找,无需担心遗忘或丢失。 最后,提到的二代密码(Two-...

    代码中密码存储sskeychain

    总结,`SSKeychain`是一个强大且易用的工具,它极大地简化了在iOS应用中安全存储密码和其他敏感信息的过程。通过合理使用`SSKeychain`,开发者可以确保用户数据的安全性,同时遵循良好的隐私实践。

    qtkeychain:独立于平台的Qt API,可安全存储密码

    Qt钥匙扣QtKeychain是一个Qt API,用于安全地存储密码和其他机密数据。 数据的存储方式取决于平台: macOS:密码存储在macOS钥匙串中。 Linux / Unix:如果正在运行,则使用GNOME密钥环,否则QtKeychain尝试使用...

    安全芯片密码检测准则

    - **存储**:固件的安全存储要求。 - **执行**:固件的安全执行环境。 - **导入**:固件的导入安全流程。 #### 十一、自检 - 自动检查机制确保安全芯片正常运行。 #### 十二、审计 - **安全芯片标识**:记录安全...

    高安全等级密码模块安全技术设计.docx

    4. **存储单元**:包括双倍速率内存(DDR SDRAM)和闪存(FLASH),前者用于存储密码模块运行过程中产生的数据,后者则用来存储板载芯片的可执行程序。 5. **环境失效性检测(EFT)单元**:由电压和温度两个部分组成,负责...

    密码管理(数据加密)

    这通常涉及到使用密码管理器,一个能够创建强密码、自动填充登录信息以及安全存储密码的应用程序。对于记性不好的人来说,它极大地简化了密码管理的过程,避免了因忘记密码而导致的各种不便。一个好的密码管理器应...

    安全密码的C语言程序

    - **安全性**:在处理密码时,应避免明文存储,可能使用了某种加密机制对密码进行存储或传输,以增加安全性。 4. **课程设计标准**: - **可读性**:良好的编程习惯,包括合理的变量命名、注释和代码结构,使代码...

    密码学与安全协议考点整理——东南大学网络空间安全学院研究生课程

    在本篇文章中,我们将对密码学与安全协议进行整理和总结,涵盖了密码学的基本概念、安全需求、安全威胁、安全协议、密码算法、数字签名、鉴别协议、密钥管理、信息安全的相对性、安全服务、风险评估、系统设计等方面...

    商用密码应用安全性评估FAQ

    该步骤包括了密码产品的认证资格、密码算法的选择、密钥生成和分配、密钥存储和管理、密钥使用和保护等方面的评估。 第四部分:物理和环境安全层面的测评对象识别和确定 物理和环境安全层面的测评对象识别和确定是...

    Java中安全密码存储实践:加密、散列与最佳策略

    在Java中实现安全的密码存储需要考虑多种因素,包括使用强散列函数、盐值、密钥拉伸技术以及安全存储实践。本文将详细介绍如何在Java应用程序中安全地存储密码,包括密码散列、盐值生成、使用现代加密库和遵循安全...

    华为存储重置控制器管理密码.doc

    请注意,存储系统通常有安全策略限制,不允许过于简单的密码,所以在实际操作中,你需要选择符合安全策略的复杂密码。例如,在示例中,将admin用户的密码重置为123456(仅作演示,实际操作需遵循安全策略)。 密码...

    密码与网络安全试验报告

    2. 密钥管理:研究如何安全存储、分发和更新密钥,避免密钥泄露带来的风险。 3. 攻击与防御:分析常见的网络攻击手段,如中间人攻击、拒绝服务攻击和密码破解等,并提出相应的防御措施。 4. 数字签名与证书:解释...

    Go-像Dropbox一样安全地存储你的密码

    标题 "Go-像Dropbox一样安全地存储你的密码" 提示我们这个项目是用Go语言实现的一个密码管理器,其设计灵感可能来源于 Dropbox 的安全存储理念。在密码管理领域,安全性和易用性通常是最重要的考虑因素,而Dropbox...

    DAppNodePackage-bitwarden:一种安全存储密码的简单方法

    **DAppNodePackage-bitwarden: 一种安全存储密码的简单方法** 在信息化时代,密码管理变得至关重要。Bitwarden 是一款开源、免费的密码管理工具,它允许用户安全地存储和管理各种登录凭据、信用卡信息和其他敏感...

    信息安全与密码学

    1. **数据加密**:这是密码学中最基础的应用,通过加密算法将明文转化为密文,只有拥有正确密钥的人才能解密,确保信息在传输或存储时的安全。 2. **数字签名**:数字签名利用非对称加密技术,为发送者提供一种方式...

    密码编码学与网络安全第八版答案

    同时,也会探讨密码学在网络中的应用,比如电子邮件的安全、在线交易的安全保障以及云存储的数据保护。 "Crypto8e-Solutions"这个文件名表明这是该书第八版的解决方案集。通过研究这些答案,学习者不仅可以检查自己...

    计算机网络安全与密码技术

    总结来说,计算机网络安全与密码技术是通过加密、身份验证和完整性检查等手段,确保信息在传输和存储过程中的安全性。从古典密码到现代的公钥密码算法,密码学不断演进以应对日益复杂的网络安全挑战。理解这些基本...

    操作系统安全:WINDOWS密码安全配置.pptx

    6.用可还原的加密来存储密码:禁用;在桌面上按下Win键+R键,打开“运行”窗口:输入:gpedit.msc;4、打开“组策略”窗口 ;在“组策略”窗口中依次选择“计算机配置”>“Windows设置”>“安全设置”>“账户策略”>...

    安卓的本地密码实现Demo sharedpreference

    总之,这个“安卓的本地密码实现Demo sharedpreference”是一个学习如何在Android中安全存储密码的好资源。它展示了SharedPreferences的基本用法,以及如何结合加密技术来增强安全性。在实际应用中,开发者应根据...

Global site tag (gtag.js) - Google Analytics