如何加密传输和存储用户密码

时光斑驳了记忆 2018-05-21 15:45:47 ⋅ 961 阅读

为什么写这篇文章

近期,Github被爆出,在内部日志中记录了明文密码。

虽然据说影响面很小(因为日志外部访问不到),但是网络和数据安全问题又一次被放到台面上。大多数用户的常用密码就那么几个,一旦被黑客拿到,去其他网站“撞库”,可能会造成用户的财产损失。

本篇文章主要介绍如何加密传输和存储用户密码,并讲解相关原理。

加密传输

加密主要有两种方式:对称加密和非对称加密。

对称加密

对称加密算法在加密和解密时使用的是同一个秘钥。

对称加密的模式是:
- 甲方选择某一种加密规则,对信息进行加密
- 乙方使用同一种规则,对信息进行解密

客户端和服务端进行通信,采用对称加密,如果只使用一个秘钥,很容易破解;如果每次用不同的秘钥,海量秘钥的管理和传输成本又会比较高。

非对称加密

非对称加密算法需要两个密钥来进行加密和解密,这两个秘钥是公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥)。

非对称加密的模式则是:
- 乙方生成两把密钥(公钥和私钥)。公钥是公开的,任何人都可以获得,私钥则是保密的
- 甲方获取乙方的公钥,然后用它对信息加密
- 乙方得到加密后的信息,用私钥解密。

即使黑客拿到了公钥,没有私钥也是没有办法解密,不考虑彩虹表的情况,完全可以长期使用一对秘钥。

RSA算法

最经典的非对称加密算法是RSA算法。

RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。公钥私钥成对出现,用其中一个加密只能用另一个解密,通常用公钥加密私钥解密。

为什么RSA能够做到非对称加密呢?

互质关系:如果两个正整数,除了1以外,没有其他公因子,我们就称这两个数是互质关系

简单来说,RSA利用的原理是,如果两个互质关系的正整数的乘积足够大,是极难进行因式分解的(目前被破解的最长RSA密钥是768个二进制位,而正常使用的至少是1024位的密钥)。

通过一定的运算,把某计算结果和乘积作为公钥,另一个计算结果和乘积作为私钥,即可以实现,利用公钥进行加密,并利用私钥进行解密。具体的数学公式推导和证明可以参考RSA算法原理

github的登录方式

传输层面的加密解密原理讲的差不多了,我们来看看github是如何传输账号密码的。

抓包看一下登录请求的request,赫然发现,密码是通过明文传输的……

那么,这种传输方式安全嘛?还可以,因为使用了https,但还不够安全。

http和https

常规的http请求,所有信息明文传播,只要中间人在链路中的任意阶段进行劫持,就会带来三大风险:

  • 窃听风险(eavesdropping):第三方可以获知通信内容。

  • 篡改风险(tampering):第三方可以修改通信内容。

  • 冒充风险(pretending):第三方可以冒充他人身份参与通信。

怎么解决这些问题?用https。

https 可以认为是 http + TLS,TLS 是传输层加密协议,它的前身是 SSL 协议。

SSL/TLS协议是为了解决http的三大风险而设计的,希望达到:
- 内容加密。所有信息都是加密传播,第三方无法窃听。
- 身份认证。配备身份证书,防止身份被冒充。即使被 DNS 劫持到了第三方站点,也会提醒用户有可能被劫持
- 数据完整性。防止内容被第三方冒充或者篡改。具有校验机制,一旦被篡改,通信双方会立刻发现。

说了这么多,https到底做了什么?结合以下流程图,讲解一次https请求都发生了什么:

1、客户端发起https请求

2、服务端的配置

一般需要向权威机构申请一个证书(也可以自己制作,这个会在之后的中间人攻击中讲到,区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会提示),证书会生成RSA加密使用的一对公钥A和私钥B。

3、传送证书

这个证书主要内容是公钥A,也包含了其他信息,如证书的颁发机构,过期时间等等。

4、客户端解析证书

由客户端的TLS来完成的,主要是验证公钥A是否有效,比如颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。如果证书没有问题,那么就生成一个随机值。之后就进入了不对称加密(RSA)的过程,用证书对该随机值进行加密,生成私钥C。

5、传送加密信息

这部分传送的是用证书加密后的随机值(即私钥C),目的就是让服务端得到这个私钥,后续所有的数据都可以用私钥C,进行对称加密和解密。

6、服务端解密信息

服务端用私钥B解密后,得到了客户端传过来的私钥C,到此RSA非对称加密的过程结束了。

7、传输加密后的信息

服务端用私钥C加密信息。

8、客户端解密信息

客户端用之前生成的私钥C解密服务端传过来的信息,于是获取了解密后的内容。

中间人攻击(MITM)

上面的过程,看起来似乎无懈可击?并不是,因为“人”才是安全系统中最脆弱的环节。

https信息的安全,完全建立在证书可信的基础上,如果中间人伪造证书怎么办?

黑客自己伪造的证书需要客户端验证通过,才可以继续访问,只要客户端验证通过,那么公钥A,私钥B和私钥C对黑客来说都是透明的,也有没有数据安全可言了,所以黑客只要诱导用户安装自己伪造的证书即可,例如使用各种钓鱼的不可描述网站。

所以即使使用https传输明文密码,也不是绝对安全的。那怎么样才能保证密码安全呢?

百度的登录方式

抓包看一下百度的登录请求发现,密码是加密过的:

怎么加密的?我们发现,有这么一个关键请求:

response里有pubkey,意味着,密码使用RSA进行加密和解密处理的,这个请求传输的是公钥。那么流程是什么样的呢?

查了一下github中,关键词RSA,star数最多的JavaScript库jsencrypt,惊喜的发现,百度登录的加密方式和使用的函数名都和这个库一致,那我们是不是可以大胆假设百度整套登录请求时的流程和这个开源库基本一致呢,那jsencrypt的流程又是什么样的呢,如下图:

加密存储

到这里,加密传输的过程已经完结了,现在服务端已经收到了用户真实的密码(解密后的),那怎么存储这个密码呢?

千万不要用明文存储密码

如果用明文存储密码(不管是存在数据库还是日志中),一旦数据泄露,所有用户的密码就毫无保留地暴露在黑客的面前,开头提到的风险就可能发生,那我们费半天劲加密传输密码也失去了意义。

用哈希算法加密密码

单向加密算法:只能从明文生成一个对应的哈希值,不能反过来根据哈希值得到对应的明文。

常用的给密码加密的算法是几种单向的哈希算法。

经常被大家用来加密的算法有MD5和SHA系列(如SHA1、SHA256、SHA384、SHA512等)。

虽然用哈希算法能提高密码存储的安全性,但还是不够安全。

通常黑客在侵入保存密码的数据库之后,他会随机猜测一个密码,生成一个哈希值。如果该哈希值在数据库中存在,那么他就猜对了一个用户的密码。如果没有猜中也没有关系,他可以再次随机猜测下一个密码进行尝试。

事实上黑客为了提高破解密码的效率,他们会事先计算大量密码对应的各种哈希算法的哈希值,并把密码及对应的哈希值存入一个表格中(这种表格通常被称为彩虹表),在破解密码时只需要到事先准备的彩虹表里匹配即可。因此现在黑客们破解仅仅只用哈希算法加密过的密码事实上已是不费吹灰之力。

加“盐”提高安全性

盐:一个随机的字符串,往明文密码里加盐就是把明文密码和一个随机的字符串拼接在一起。

为了应对黑客们用彩虹表破解密码,我们可以先往明文密码加盐,然后再对加盐之后的密码用哈希算法加密。由于盐在密码校验的时候还要用到,因此通常盐和密码的哈希值是存储在一起的。

采用加盐的哈希算法对密码加密,要确保要往每个密码里添加随机的唯一的盐,而不是让所有密码共享一样的盐。

虽然加盐的算法能有效应对彩虹表的破解法,但它的安全级别并不高,因为计算哈希值耗时极短,黑客仍然可以用穷举法来破解,只是增加了一些耗时。

用BCrypt或者PBKDF2增加破解的难度

为了应对暴力破解法,我们需要非常耗时的而不是非常高效的哈希算法。BCrypt和PBKDF2算法应运而生。

这两个算法最大的特点是我们可以通过参数设置重复计算的次数,重复计算的次数越多耗时越长。如果计算一个哈希值需要耗时1秒甚至更多,那么黑客们采用暴利法破解密码将几乎不再可能。破解一个6位纯数字密码需要耗时11.5天,更不要说高安全级别的密码了。

总结

如果我们想要尽可能保证用户的信息安全,我们需要做以下的工作
- 使用https请求
- 利用RSA加密密码并传输数据
- 用BCrypt或者PBKDF2单向加密,并存储

以上。


关注我们

更多精彩内容请关注”IT实战联盟“公众号哦~~~



全部评论: 0

    我有话说:

    KeePass 2.47 发布,密码管理工具

    KeePass 2.47 发布了。KeePass 是一款密码管理工具,可以帮助用户记住电子邮件、主页 FTP、论坛等用户名密码。KeePass 将密码保存在高度加密的数据库中,不让其他人其他应用

    「轻阅读」亿级用户的分布式数据存储解决方案

    分布式数据库分布式存储是分布式系统中难度最大、挑战最大,也是最容易出问题的地方。互联网公司只有解决分布式数据存储的问题,才能支撑更多次亿级用户的涌入。

    Firefox 85.0 正式发布,加强用户隐私保护

    Firefox 85.0 正式发布了, 该版本主要加强了对用户的隐私保护,防止其浏览网页时被追踪。 新功能 Firefox 现在可以保护用户免受 supercookies 的侵害

    对称加密,非对称加密,公钥私钥

    对称加密有很多名称,例如对称密码,私钥密码,它类似家里的保险柜,把密码设置成9527然后锁上,那么也需要使用9527才能打开......

    QQ停止为欧洲用户提供服务/哈罗单车获7亿美元融资,共享单车三足鼎立已成/快手们被中央点名,融资前景如何?

    QQ停止为欧洲用户提供服务;哈罗单车获7亿美元融资,共享单车三足鼎立已成;快手们被中央点名,融资前景如何?

    【简单】Docker - 实战TLS加密通讯

    快速配置一个最简单的docker TLS加密通讯

    密码管理工具:1Password for Linux Beta发布

    1Password for Linux 首个 Beta 测试版已发布,正式版计划在明年初推出。1Password 是一款流行的密码管理软件,兼容 macOS、iOS、Windows

    家再获B轮30亿融资加入滴滴造车梦/小程序的危机!小程序受到联合挑战!/“大数据杀熟”涉欺诈......

    家再获B轮30亿融资加入滴滴造车梦;小程序的危机!小程序受到联合挑战!;“大数据杀熟”涉欺诈,住宿、出行、购票要当心;5千万用户信息遭泄露,或将面临2万亿美刀处罚,Facebook是否还能坚挺?

    OAuth2 JWT - 如何设计安全的 API?

    来源:jianshu.com/p/1f2d6e5126cb JWTOAuth2比较? JSON Web Token (JWT) OAuth2是什么? 结论 在作者看来两种

    面试官:如何在海量数据中判断某个数据是否存在

    https://www.toutiao.com/a6756788128960217604这是一道面试题:如何

    产品匠心打磨200天,仅推出市场半年用户量突破1亿,日播放视频超10亿,PK快手美拍

    抖音从8人团队起家是如何在短短500天取得如此成绩,本文试图从产品运营的角度来复盘一下,希望可以尽可能探讨背后的真相。

    京东技术:面对海量流量七步走保证用户体验(部分操作能够快速实战)

    当促销活动正式开始时,不少用户开启了价格保护,在此高并发情况下,如何保证用户体验,如何保证系统的稳定性、高可用、快速计算结果,是本文的重点。

    用户体验设计干货笔记

    ,擅长产品设计侧线上用户转化留存、线上下体验场景管理、设计团队管理影响力建设,体验设计底层理论方法深厚扎实。

    「下载」Spring Cloud Alibaba 从入门到实战.pdf

    前言 近些年随着云技术的发展,越来越多的用户选择使用云技术来代替将传统的 IT 基础设 施。在云技术发展的早期,业界的关注点集中在虚拟化、分布式、存储等 Iaas 方面的技 术。但是随着“云原生

    Python 3.9.2 3.8.8 现已发布

    Python 3.9.2 3.8.8 发布了。虽然在 3 天前才发过 RC 版本,但由于该版本包含两个安全性修复程序,在用户的敦促下,最终选择加急发布正式版。 接下来,将于 2021 年 5 月

    创业团队如何设计支撑百万并发的数据库架构?

    我们来聊一下对于一个支撑日活百万用户的高并系统,他的数据库架构应该如何设计?

    Openfire 4.6.2 发布,即时消息传输平台

    ) 服务器,它非常易于设置管理,提供良好的安全性...

    时序数据库 InfluxDB 2.0 正式 GA,并宣布下一代存储引擎 InfluxDB I0x

    存储可视化查看时间序列数据,并通过利用新工具...