159

雅虎宣称"半个世界"被盗,是时候学习一下安全加密大法了! - 恒生技术之眼...

 6 years ago
source link: http://rdc.hundsun.com/portal/article/821.html?
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

雅虎宣称"半个世界"被盗,是时候学习一下安全加密大法了!

雅虎公司近日宣布,在2013年黑客入侵雅虎的事件中,30亿个用户账号信息被盗。这一数字是此前公布被盗账号数量的三倍。为此公司已经向更多用户发送提示,请其更改登录密码以及相关登录信息。这再一次证明了密码加密的重要性。今天我们就跟大家分享一下密码加密的几大方法。

【密码加密方法介绍】

一般情况下,我们在选择密码加密方案的时候(这里不字面关注加密和hash的区别),我们会从安全,性能,易用性等方面出发来考虑。常见的实现方式有:普通hash,hash加盐,hash加盐在做hash,以及使用密钥扩展机制的pbkdf2,bcrypt,scrypt,argon2等。

这里我们单从安全性出发(不考虑太多的性能方面的问题),来讲一下我们推荐的方法。首先,来看一下有哪些方式可以将hash后的值还原成明文(这里不考虑hash碰撞,侧信道等攻击方式,且不考虑sha1系列已证明不安全的hash函数族):一、 爆破;二、 字典攻击;三、 彩虹表。

针对上述攻击,一般有加盐,使用消耗cpu,内存,gpu等资源的算法等方式来防范(在对抗上述攻击的时候,“慢”很重要),同时通过增加所谓的work factor可以较为有效的对抗硬件设备更新换代带来的对原配置的破解速度的加快的风险。

考虑安全性,一定要考虑在最坏的情况下的有哪些风险,假设黑客攻破服务器,算法,hash值和盐值都暴露的情况下,sha阵亡无可避免(hash速度快,硬件设备飞速发展),那么怎么样才能最大程度的给黑客破解密码造成阻碍,答案只有pbkdf2,bcrypt,scrypt,argon2.(因为慢,消耗资源多,盐值不固定,攻击成本较高)。

【密码加密四大算法比较】

◤PBKDF2◢

PBKDF2(Password-Based Key Derivation Function)是一个用来导出密钥的函数,常用于生成加密的密码。

它的基本原理是通过一个伪随机函数,例如HMAC-SHA256函数,把明文和一个盐值作为输入参数,然后重复进行运算,并最终产生用于后续加密的密钥。如果重复的次数足够大(虽然hmac-sha256计算速度很快,假设需要0.001秒,次数如果是10000次,那就需要10秒才能产生密钥)破解的成本就会变得很高。而运算轮数的增加及盐值的添加也会增加“彩虹表”攻击的难度。

Work factor:iteration(轮数)。

▪ 优点
1.发布的时间长,经历了足够的考验,暂无有效攻击。

2.各种语言的实现都有,方便使用。
3.高度可配置,基于安全基于性能一定程度上都可以满足。
4.知名产品加成(Django,veracrypt,lastpass,微软部分产品)。

▪ 缺点:算法是cpu密集型,对多gpu及专用设备如各种矿机等,无法有效拖慢攻击速度。

▪ 使用方法

f_43159ef2d2780ea9cfcc4f0f0c76ac76.png
f_8ccbdb3a8af47814b43c88096eba4e97.png
f_80c31a5e52e1c8ada90ee7d67e113bba.png

▪ 输出

f_174331063abec30319700be8811c9f24.png

◤Bcrypt◢

Bcrypt是由Niels Provos和 David Mazières1999年发布的,基于blowfish的,专用的密码哈希算法。推导key时,通过自带函数产生盐值,指定轮数,使计算时间加长,对抗攻击。

▪ 优点
1.发布时间长,久经考验。
2.对通过gpu计算不友好,增加攻击成本。
3.盐值储存在输出中,无须单独存放,也无需自己生成盐值(防止盐值长度不够,盐值固定等)。
4.使用简单,各语言支持良好。

▪ 缺点:一般情况下密码输入长度限制在72个字符(不包括末位”\0”结束符,前72个字符相同的情况下,如果密码超过72个字符,在盐值相同的情况下,最后的计算结果一样)。对以前的cuda不友好,但是在fpga上已有算法实现。

▪ 使用方法

f_ee6f31165be7ddfaa8a6bc93fb4643a4.png

▪ 输出

f_a5be8f1b663dcba187c5f528a997d6eb.png

红色可以认为是hash函数的标志符,有兴趣可以看一下https://en.wikipedia.org/wiki/Passwd#Shadow_file这个里面的解释。黄色的“12”是指2的12次方的轮数,灰色部分是22的盐值(也可以认为所有有颜色部分是盐值,上面代码中gensalt函数结果就是三部分相加的结果),剩下可认为密码处理后的值。

◤Scrypt◢

Scrypt是由Colin Perciva于2009年推出的,特点简单来说不仅耗cpu,也耗内存。

scrypt(Passphrase,N,r,p)
• Passphrase – 用于推导key的密码原文
• N – 轮数
• r – 内存消耗参数
• p – cpu消耗参数
work factor:轮数,内存消耗参数,cpu消耗参数。具体点的解释可以参考https://stackoverflow.com/questions/11126315/what-are-optimal-scrypt-work-factors

▪ 优点
1. 既耗cpu,又耗内存。
2. 从实现上来说比前两者更加安全。

▪ 缺点
1. 比较新,经历的攻击略少。(主要被用到挖矿上面去了,比如莱特币等)
2. 语言支持少。
3. 参数多,且比较难懂,难配置。

▪ 使用方法

f_f9a8d262a231617012b6fa4c718cba62.png

▪ 输出

f_0c2ead47e4d725dbb387676e9029cef0.png

红色部分同样可以理解为算法标志,黄色部分是16进制的log2(N),r,p参数,灰色是base64以后的盐值,剩下部分可以认为的是密码处理后的值。

◤Argon2◢

Argon2 2015年哈希竞赛获奖函数。有三个变种:

argon2d,较另外两者快,对gpu破解方式抵抗最好,较为适用于加密货币类的应用;argon2i,速度最慢,且对侧信道攻击防范最好,适用于密码哈希存储等。Argon2id,混合型。

这里我们用的是argon2i。

▪ 优点
1. 对gpu,和专用的fpga及asic设备不友好。
2. 对TMTO类攻击抵抗能力强。
3. 规避了pbkdf2及bcrypt的部分缺点。

▪ 缺点
配置参数多。
出生时间最短,经历的攻击少。(2016年argon2i低版本的出现过所谓的安全问题)
work factor: 轮数,内存消耗量,线程数。

▪ 使用方法

f_76978af98ba59634a6b6e207786c55fa.png
f_ca48c8db9ecfd467628f8433e6808240.png

▪输出

f_f540ab1611aee71b4644ba7c518955ed.png

红色部分表示算法选择,版本,及轮数,线程数,内存参数;黄色部分为盐值,剩下的可认为密码处理后的值。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK