加密算法应用之密码保护

      目前,各企、事业单位和国家机关纷纷建立了自己的信息系统,并且各信息系统的规模在不断扩大,地位和作用也越来越突出,安全问题也就逐渐被人们所重视。人们关注较多的是网络传输的数据安全,而系统后台服务器存放的用户口令的泄密也会给企业带来不可估量的损失。因此,建立一套完善的安全机制,以有效保护用户口令同样重要。

    本文以用户登录模块为应用场景,从加密、传输、存储三方面,介绍如何对用户的密码进行保护,才不会导致用户信息泄露。

    涉及的知识点:加密算法、消息摘要算法、安全随机函数、硬件加密设备、用户登录最佳实践等。

数据泄露事件(数据来源于互联网)
    2011年12月,国内最大的程序员社区 CSDN 遭拖库,600万个账户信息泄露。

    2014年5月,小米论坛涉及800万用户信息遭泄露,信息包括用户名、密码、注册IP、邮箱等。

    2015年10月,网易邮箱遭攻击,近5亿条用户信息被泄露,包括用户名、密码、密码保护信息、登陆IP以及用户生日等多个原始信息。

    2016年,UBER泄露的数据包括五千万名优步客户的姓名、电子邮件和电话号码,大约七百万司机个人资料

    2017年6月,美国共和党全国委员会承包商托管在AWSS3上的数据库泄露,暴露了超过1.98亿美国公民1.1TB的资料,约占投票人口的61%,泄露的数据包含美国选民的个人信息。 

    2018年8月 华住5亿条数据泄露,包括1.23亿条官网注册资料、1.3亿条入住登记身份信息以及2.4亿条详细开房记录。当天股价下跌4.36%
    2018年6月3日,以色列DNA测试网站Myheritage 9230 万个用户的邮箱地址和哈希密码泄露。并没有发现这些泄露数据遭到滥用的情况,而且黑客只是获取了用户邮箱地址。
    2018年6月13日凌晨,AcFun(A站)发布公告称,A站受到黑客攻击,近千万条用户数据外泄,2017年7月7日之后从未登陆过的用户以及密码强度低的用户需要立刻更改密码,而跟A站用户信息中密码保持一致的,也要一并更改。


对称加密:采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。
常用对称加密算法:AES、SM4、3DES、TDEA、Blowfish、RC5、IDEA、SKIPJACK、 DES、XXTEA
加密:Aes(“密钥”,“要加密的值”)

非对称加密:非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。
常用加密算法: ECC、RSA、Elgamal、Diffie-Hellman、DSA(数字签名)、SM2 
ECC和RSA区别:
    RSA在1976年发明,为了保障数据安全,RSA的密钥需要不断增加,但密钥的长度导致其加解密的速度大为降低。1985年ECC发明,并推广迅速.ECC的优势:抗攻击性强、CPU占用少,内容使用少,加密速度快
    
消息摘要算法(Hash算法):Hash,一般翻译做“散列”,也有直接音译为“哈希”的。就是把任意长度的输入通过散列算法变换成固定长度的输出(消息摘要),该输出就是散列值。 
不推荐的Hash算法:MD5、SHA-1

一般Hash算法:SM3、 SHA3-512 、SHA3-256 、SHA2-512、 SHA2-256、 HAVAL、 RipeMD、WHIRLPOOL

慢Hash:bcrypt、 PBKDF2、 scrypt

密钥Hash:HMAC
扩展阅读:算力(也称哈希率)是计算机计算哈希函数输出的速度。在比特币“挖矿”中,对于数学难题的求解 需要找到相应的数学解,而对于任意一个给定范围内的 Hash 值,其求解只能通过自动 生成的随机数,因此一个挖矿机每秒能做多少次求解过程就是算力的代表,其单位为 Hash/s。例如,当达到10Th/s的哈希率时,意味着它可以每秒进行10万亿次计算。
截止至 2018 年 8月,比特币全网算力约为 45EH/s。(450亿兆哈希/秒)

什么是加盐哈希
假如密码是 “a123456. ”,md5 的结果如下:
Md5(“a123456.”)=9A40BF57F7C5C6D317AC689DFD359F89

简单密码,是很容易被逆推出来的。

但是假如我们往简单密码里加点盐:
Md5(“a123456.”+ “%&d73h*”)=42CF9F20BF02D6FFA36557BE6334469F  那么散列值就会安全很多

加盐的正确方法:
不要使用固定不变的 salt。
每个用户的 salt 都需要不同。
salt 要保持一定的长度。
salt 必须由服务端使用安全的随机函数生成。防止随机数被预测。
客户端运算需要的 salt 需要从服务端动态获取。
客户端加盐 hash 的结果并不是最终服务端存盘的结果。

密钥哈希算法介绍
只要攻击者可以检测对一个密码的猜测是否正确,那么他们就可以进行字典攻击或暴力攻击。
通过软件实现更安全的密码,那么可以向哈希计算中增加一个密钥,只有知道这个密钥的人才能校验密码。有了这层加固,即使数据被拖库,攻击者也无法从 hash 的结果逆推回原始密码。
比如使用AES算法;将密钥包含到哈希字符串中,或使用密钥哈希算法HMAC。
加密:Hmac(“密钥”,“HASH值”)
使用建议:
1.大部分针对数据库的入侵都是由于SQL注入攻击,因此不要给攻击者进入本地文件系统的权限(禁止数据库服务访问本地文件系统
2.不要将密钥硬编码到代码里,尤其是多套部署时,应该在安装时随机生成。
3.使用加密协议传输KEY,对访问者进行验证,只允许特定的机器有权限访问。
4.如果攻击者获取了进入系统的最高权限,那么无论密钥被储存在哪,他们都可以窃取到。
5.无论如何,这个措施比没有好。

慢哈希介绍
慢哈希(是一种密钥扩展技术)这类算法使用一个安全因子或迭代次数作为参数,这个值决定了哈希函数会有多慢。
PBKDF2
PBKDF2 是一个比较简单的算法,它根据’iterations’参数大小,执行N次HMAC运算。
HW数据库密码存储的最低安全要求是,1000次HMAC-SHA256计算,推荐的是1万次。使用GPU阵列、或FPGA来破解PBKDF2仍相对容易。注意这里说的是相对,为了比较接下来提到的另外两种算法。
BCrypt
BCrypt 在1999年发明,基于Blowfish加密算法变形而来。 bcrypt最大的好处是有一个参数(work factor),可用于调整计算强度,而且work factor是包括在输出的摘要中的。bcrypt经过了很多安全专家的仔细分析,使用在以安全著称的OpenBSD中,一般认为它比PBKDF2更能承受随着计算能力加强而带来的风险。bcrypt也有广泛的函数库支持,因此建议使用这种方式存储密码。
Scrypt
Scrypt 于2009年产生,和上述两种方案不同,scrypt不仅计算所需时间长,而且占用的内存也多,使得并行计算多个摘要异常困难。据scrypt网站称,“针对scrypt的硬件暴力攻击的成本大约是类似bcrypt攻击的成本的4000倍”。 scrypt没有在生产环境中大规模应用,并且缺乏仔细的审察和广泛的函数库支持。但是,scrypt在算法层面只要没有破绽,它的安全性应该高于PBKDF2和bcrypt。

spring security中默认使用的BCryptPasswordEncoder慢哈希方法,每次加密的结果都不一样。
采用Blowfish +随机盐+密钥对密码进行加密。
其中:$是分割符;2a是bcrypt加密版本号;14是cost的值(2的指数,10是1024次),用于指定Hash的次数,(范围:4-31);而后的前22位是salt值;再然后的字符串就是密码的密文了。


使用建议:如果在一个Web程序中使用密钥扩展,需要额外的资源处理大量认证请求,并且密钥扩展也使得网站更容易遭受拒绝服务攻击(DoS。不过把迭代次数设定得低一点,应该基于认证请求最高峰时的剩余硬件资源来计算迭代次数。要求用户每次登录时输入验证码可以消除拒绝服务的威胁。另外,可以把系统设计为迭代次数可随时调整的。执行一个简短的性能基准测试,找到使哈希函数大约耗费0.5秒的值。这样,程序就可以尽可能保证安全,而又不影响到用户体验。

 

本文中的代码在比较哈希值的时候,都是经过固定的时间才返回结果

    以上算法都也都运用了“慢比较”技术,比如Bcrypt. matches方法

 

    举个例子,使用标准的方法比较“xyzabc和“abcxyz,由于第一个字符就不同,不需要检查后面的内容就可以马上返回结果。相反,如果比较“aaaaaaaaaaB和“aaaaaaaaaaZ,比较算法就需要遍历最后一位前所有的“a”,然后才能知道它们是不相同的

    有人已经实现了运用计时攻击破解密码,因此在比较密码时要注意

什么是安全的随机数?
在安全应用场景,随机数应该使用安全的随机数。密码学意义上的安全随机数,要求必须保证其不可预测性。
不可预测性是指每个数都统计独立于其他数,因而不可预测。不能让攻击者从先前的随机数推导出后面的随机数。

 

使用计算机生成随机数的主要方法有两种:伪随机数生成器(PRNGs)和真随机数生成器(TRNGs)。这两种方法有不同的特点,各有利弊。

伪随机数:并不是你所期望的那种随机数字,而是一种算法。它使用数学公式或简单的预计算表来生成随机出现的数字序列。线性同余法是PRNG的一个很好的例子。

伪随机数特点:高效、可预测性、有周期

伪随机数在Linux系统中调用:/dev/urandom

真随机数:从物理现象中提取随机性并将其引入计算机。生成真实随机数的过程都涉及到识别数据中不可预测的微小变化。例如,HotBits在放射性衰变和随机衰变之间的延迟上几乎没有变化。ORG使用了大气噪声振幅的微小变化。

真随机数特点:效率低、不可预测、没有周期

真随机数在Linux系统中调用:/dev/random

各语言安全的随机函数:

PHP

mcrypt_create_iv, openssl_random_pseudo_bytes

Java

java.security.SecureRandom

Dot NET (C#, VB)

System.Security.Cryptography.RNGCryptoServiceProvider

Ruby

SecureRandom

Python

os.urandom

Perl

Math::Random::Secure

C/C++

(Windows API) CryptGenRandom

Any language on GNU/Linux or Unix

Read from /dev/random

 

真随机数JAVA实现例子

byte[] salt = new byte[128]; 
SecureRandom secureRandom = new SecureRandom(); secureRandom.nextBytes(salt);
不要自己指定种子。如: secureRandom.setSeed(System.currentTimeMillis());
应当使用系统随机源。
系统默认的随机源是什么?
这取决于$JAVA_HOME/jre/lib/security/java.security配置中的securerandom.source属性。
例如jdk1.8中该配置为:
securerandom.source=file:/dev/random
使用无参构造函数实例化SecureRandom,在大多数系统中,默认的算法是“nativePRNG”,从/dev/random获取随机数

 

硬件加密设备介绍
硬件加密设备包括加密U盾、安全模块(HSM)、加密机等通过加密算法和加密密钥将明文转变为密文进行数据保护的安全技术。硬件加密设备的核心是密码学。加密设备目前仍是大数据时代保护信息的一种最可靠的办法。

为什么使用硬件加密设备?

    从技术实现的方式来看,目前存在两类加密机制:软件加密和硬件加密。软件加密实现容易,投资较小,但密钥及算法易于外泄,安全级别较低。

    当采用硬件加密时,密钥存放在加密设备中,任何人都无法获得加密设备中的密钥,同时高端的加密设备如加密机自身的安全性也作了周全的设计,使其不仅具有物理锁防撬、打开机盖密钥自动销毁的防拆设计,而且在情况紧急时,如断电的情况下,也能快速地进行人工毁钥等技术手段,来有效地防止内、外部人员的攻击。

硬件加密机如何保证安全?
    1.制度上,对主密钥永远保密处理(用多分量机制)
    2.渗透的每个用户的密码(一机一密或一户一密)
    3.每个机器或每户都有相应的主密钥和工作密钥
    4.主密钥定期更换,工作密钥和MAC密钥每天更换或按需更换
    5.对密码,永不进行解密,不存在解密机制,只能对比是否正确
    6.跨系统,使用转加密机制
    
在实际应用中,应用服务器通过TCP/IP协议与硬件加密平台连接,应用系统通过调用API函数来使用加密机的服务。API符合GM/T 0018-2012《密码设备应用接口规范》。

看了这么多介绍,主要目的是让读者了解常用的密码保护手段。下面一篇文章给出用户登录最佳实践(主要针对中小型系统(登录认证访问量在50人每秒),对并发要求高的请使用硬件加密机)

用户登录最佳实践(基于慢哈希)

https://blog.csdn.net/bjspo/article/details/90059325

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bjspo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值