安全存储密码:Hashing 还是加密?

对于网站来说, 再没有什么比用户信息泄露更让人尴尬的了。 尤其是当存有用户密码的文件如果被黑客获取, 对网站的安全和用户的信心来说都是巨大的打击。 如最近的Ebay泄密事件和小米的用户数据泄露事件。 保证用户信息安全首先需要正确理解对于用户密码的安全控制和保护。 这里OWASP的主席Michael Coates最近的一篇关于一些基本概念的介绍能够帮助开发人员更好的理解现代Hashing算法和加密对于用户密码保护的作用。 安全牛编译如下:

在过去几个月, 我们看到了一些严重的数据泄露事件, Ebay和Adobe的数据泄露事件影响了几百万用户。 Snapchat也遭受到了数据泄露事件的影响。 每一次密码泄露事件后, 人们都会问同一个问题, 这些密码的存储是不是安全? 不幸的是, 这个看上去简单的问题其实并不好回答。

尽管在很多情况下, Hashing和加密都能够满足安全存储的需要, 对于在线应用而言, 很多情况下, 对于用户密码的安全存储往往只有一种正确的方案。 Hashing.是通过一个不可逆的杂凑函数计算出一个Hash值, 而通过这个值无法逆向计算出输入值(比如用户密码)。 对称加密则是采用密钥进行加密计算, 这是一种可逆的运算。 任何人如果有了密钥, 就能够解密出原始明文。

下表是Hashing和对称加密的对比

显示第 1 至 6 项结果,共 6 项

当在线应用收到一个用户名和一个密码后, 就以密码为输入到杂凑函数中去得出一个Hash值, 然后用这个Hash值与数据库中存储的该用户的密码Hash值做比较, 如果两个Hash值相同, 就可以认为用户提供了有效的用户名和密码。 采用Hashing的好处是, 应用不需要存储用户的明文密码, 只需要存储Hash值。

在线应用如何利用密码的Hash值来认证用户

下图就是关于采用Hashing方式的简单描述:

那么, 所有杂凑算法都能用吗? 不是的, 事实上, 杂凑算法中不同的算法的差别很大, 并不是所有的杂凑算法都适合存储密码。

说起来可能有点出人预料, 早期的杂凑算法速度过快, 黑客们尽管不能通过Hash值逆向计算出原输入值, 但是黑客们可以通过暴力破解的方式遍历所有可能的密码组合来尝试能够能够“碰撞”到用户密码的Hash值。 为了避免这种威胁, 现代的杂凑算法能够通过多重迭代, 使得在每次Hash计算时产生一些延时, 对单次Hash计算, 这样的延时基本没有任何影响, 而对于黑客的暴力破解来说, 几百万次计算的延时能够被放大几百年, 这样到使得暴力破解基本不现实的地步。

在Hashing中, 最好采用针对每个用户的盐化方式, 通过对用户密码添加一个随机字符串(随机字符串可以是显式存储), 这样可以相同的密码产生相同的Hash值, 这样, 攻击者可以下载一个巨大的存有事先计算好Hash值的查找表, 也叫做彩虹表。 通过Hash值, 反向查找对应的输入值。

而通过下面两个表格可以看出, 通过对不同用户进行不同的盐化, 同样的密码就会出现不同的Hash值, 这样使得攻击者利用彩虹表进行攻击变得困难。

没有盐化

盐化后

类似于账户锁定的机制对于密码存储的模式有什么影响吗?

简单的回答, 就是, 没有影响。 对密码的安全存储是为了提供在密码文件被盗取后的防护。 黑客对于密码Hash的攻击是一种离线攻击。 也就是说, 密码文件已经被盗取, 黑客可以利用自己的计算机通过尝试不同的密码来找出密码。 由于是离线攻击, 账号锁定或者验证码之类的安全机制已经没有作用了。 这些机制只有在针对网站服务器的在线登录页面攻击时才会起作用。

对于密码存储, 采用对称加密而不是Hashing的风险在哪里?

对称加密的设计就是一个可逆的运算, 这意味着在线应用必须能够访问到密钥, 并且在每次密码验证时都要使用。 如果加密后的密码被窃取的话, 黑客需要获取对称加密的密钥, 而一旦密钥被破解出来, 不管是通过某种方式泄露出来, 或者一些弱的密钥被暴力方式破解出来, 所有的密码都会被黑客获得。

总结

对于密码的安全存储来说, 理解对称加密与Hashing的区别非常重要。 一些如PBKDF2, bcrypt以及scrypt等算法都采用的每用户盐化以及多重迭代的Hashing方式以安全存储密码。

互联网已经日益成为重要的用户信息存储的场所。 网站开发人员及网站老板们需要尽其所能地保证用户信息的安全。 了解如何利用现代的Hashing算法对用户密码进行基本的安全控制保护非常重要。

时间: 2024-09-17 20:00:01

安全存储密码:Hashing 还是加密?的相关文章

加密-如何能够知道网站是明文存储还是密文存储密码

问题描述 如何能够知道网站是明文存储还是密文存储密码 比如我知道南通长途汽车站就是明文存储的,有些网站登录的时候,登录瞬间能看到密文变成,估计是被hash然后才上传的.如何能够有效地判断一个网站是不是被加密后储存密码的呢? 解决方案 除非能接触到网站的数据库或者程序代码,否则没法知道.如何接触到数据库和程序代码,那需要用非正常的手段. 解决方案二: 客户端只能看到是明文还是密文传输的,至于是如何存储的,就没办法知道了.除非有源码或暴库. 解决方案三: 一般都是密文存储,如果MD5加密了,是不可程

找回MD5加密的密码及MD5加密数据库中数据

有时,在开发过程中,如果不小心更改掉了项目管理员帐号的密码而又忘了,存在数据库里的密码又是MD5加密后的,这时候怎么办?最为菜鸟的我,刚开始也很迷茫,不过向前辈们请教了请教,自己也查了查资料,特意整理记录一下,并分享给大家. 前提是你知道这个密码存在在哪个表的哪个字段,只不过是加密了,如果是oracle数据库的话,可以用DBMS_OBFUSCATION_TOOLKIT.MD5 ( input => utl_raw.cast_to_raw('预置密码'))来得到一个MD5加密后的密码, 所以我们可

详解Android数据存储之SQLCipher数据库加密_Android

前言: 最近研究了Android Sqlite数据库以及ContentProvider程序间数据共享,我们清晰的知道Sqlite数据库默认存放位置data/data/pakage/database目录下,对于已经ROOT的手机来说的没有任何安全性可以,一旦被利用将会导致数据库数据的泄漏,所以我们该如何避免这种事情的发生呢?我们尝试这对数据库进行加密. 选择加密方案:  1.)第一种方案  我们可以对数据的数据库名,表名,列名就行md5,对存储的数据进行加密,例如进行aes加密(Android数据

如何使用Vault安全的存储密码和API密钥

如何使用Vault安全的存储密码和API密钥 Vault是用来安全的获取秘密信息的工具,它可以保存密码.API密钥.证书等信息.Vault提供了一个统一的接口来访问秘密信息,其具有健壮的访问控制机制和丰富的事件日志. 对关键信息的授权访问是一个困难的问题,尤其是当有许多用户角色,并且用户请求不同的关键信息时,例如用不同权限登录数据库的登录配置,用于外部服务的API密钥,SOA通信的证书等.当保密信息由不同的平台进行管理,并使用一些自定义的配置时,情况变得更糟,因此,安全的存储.管理审计日志几乎是

详解Android数据存储之SQLCipher数据库加密

前言: 最近研究了Android Sqlite数据库以及ContentProvider程序间数据共享,我们清晰的知道Sqlite数据库默认存放位置data/data/pakage/database目录下,对于已经ROOT的手机来说的没有任何安全性可以,一旦被利用将会导致数据库数据的泄漏,所以我们该如何避免这种事情的发生呢?我们尝试这对数据库进行加密. 选择加密方案: 1.)第一种方案 我们可以对数据的数据库名,表名,列名就行md5,对存储的数据进行加密,例如进行aes加密(Android数据加密

用户密码以BCrypt加密的方式来防范被破解

你会用什么样的算法来为你的用户保存密码?如果你还在用明码的话,那么一旦你的网站被hack了,那么你所有的用户口令都会被泄露了,这意味着,你的系统或是网站就此完蛋了.所以,我们需要通过一些不可逆的算法来保存用户的密码.比如:MD5, SHA1, SHA256, SHA512, SHA-3,等Hash算法.这些算法都是不可逆的.系统在验证用户的口令时,需要把Hash加密过后的口令与后面存放口令的数据库中的口令做比较,如果一致才算验证通过. 但你觉得这些算法好吗?我说的是:MD5, SHA1, SHA

rsa-模拟登录遇到了帐号密码用RSA加密怎么办

问题描述 模拟登录遇到了帐号密码用RSA加密怎么办 在做一个网站的模拟登录时,帐号密码在在JS里调用RSAUtill进行的加密,这该怎么模拟. 解决方案 最简单的是,如果你用java c#,你可以用脚本引擎也加载RSAUtil加密,如果你不用脚本引擎,就要自己事先等效的加密逻辑.rsa是标准的算法,用你的语言作为关键字google下.

sql2000对现有的数据库密码进行MD5加密

问题描述 在sql server中对现有数据密码进行md5加密 用户数据库中密码是明码,现在想改用MD5加密方式,目前有很多数据库,而且数据库中的密码都在3000条以上,pwd字段都是nvarchar类型的. 请问:SQL SERVER2000中如何实现这样的功能? 问题补充:enet_java 写道 解决方案 引用enet_java 写道java的demo !!太不幸了,我现在也没有呢. 你觉得难点在什么地方呀?MD5加密的算法,我可以PM给你一个. 那谢谢了,我自己写asp吧解决方案二:ja

调查显示40%的管理员使用Word文档存储密码

据最近的一项安全调查研究显示,40%的管理员使用Word文档存储密码.这项调查研究对象是大约750名 IT管理员和决策者.受访者中,79%的人确信他们已经吸取了重大网络攻击的教训,但是,只有67%的受访者认为公司有强有力的安全反应机制和领导,57%的受访者表示,他们觉得公司在安全方面有点令人担心. 根据这项研究显示,40%的受访者表示,他们会使用微软的Word文档或电子表格存储各种访问级别的密码和管理密码.另有28%的受访者使用共享服务器或U盘.此外,近一半的受访者承认,他们允许第三方供应商访问