《泛智能开启下一代云时代》白皮书来了!点击下载 了解详情
写点什么

密码管理器的进化史(上)

  • 2020-03-09
  • 本文字数:5523 字

    阅读完需:约 18 分钟

密码管理器的进化史(上)

很多关于密码管理器的评测和讨论大多聚焦于功能特性,而对于最关键的安全性,都没解释清楚。本系列文章主要从密码管理器保护密码的安全性角度,分享一下相关的专业知识。因密码管理器涉及很多方面的知识,本系列文章只讨论数据加密保护。



密码管理器已经进化到第四代,每一代在安全性上都有巨大提升。

一、第一代密码管理器

  • 安全技术:有管理,无保护

  • 典型代表:小本子、记事本、浏览器集成的密码管理器和一些私密云笔记


众所周知,互联网服务越来越流行,需要登录的网站不断增多,需要记住的密码快速增加。


但是,密码设置要求要复杂,包含数字、字母、符号等;不能使用相同密码。( 密码重用的危害及规避方法)于是,人们开始尝试各种管理密码的方法,有人用小本子记、有人用记事本保存到文件。同时,云笔记开始流行,还能写私密笔记,只需设置一个密码,就能随时同步。


我们使用浏览器上网,需要经常输入用户名和密码,浏览器就集成记密码和填充密码的功能。



第一代密码管理器通常都没加密,换句话说,这和你用记事本(记密码)保存在电脑上差不多。


不过,其最大的问题在于:密码明文集中保存。


并且,浏览器厂商也知道这个问题很严重,慢慢开始加密保存。不过,这并没有什么卵用。


比如,Chrome 浏览器在 Windows 上使用 DPAPI 加密,用户打开任何其他程序都可以调用 CryptUnprotectData 解密来获得密码。



甚至有人写了开源程序,能从 Windows、Mac、Linux 等平台上抓取 Chrome 浏览器保存的密码。

第一代安全技术

第一代密码管理器的安全技术特点:有管理,无保护。它根本没有加密保护,或很容易破解的简单加密保护。如果浏览器能直接读取保存的密码,那么其他应用程序也可以使用相同方法读取。


因此,如果浏览器能直接填充密码,而不要求输入独立的主密码解锁,那就没有真正的保护。


目前,浏览器还是黑客最主要的攻击目标之一,因此建议,不要使用浏览器自带的密码管理器。( Opera服务被黑,用户数据和存储密码泄露


众所周知,用记事本记密码很不安全,而输入密码才能查看的私密云笔记,却有很大的迷惑性,被很多用户误以为很安全。


一些云笔记仅仅使用密码限制用户访问,而不是使用密码加密笔记内容。如果云端被黑客入侵,那保存的密码就很可能被盗。


我不会告诉你,云笔记的开发者也可能偷看


因此,使用云笔记保存密码要小心,除非确信设置的密码是用于加密内容。

二、第二代密码管理器

第二代密码管理器:


  • 安全技术: 设置独立的主密码,端到端加密

  • 安全问题: 一旦主密码泄露,可能导致所有密码被盗


对密码这么重要的数据,第一代密码管理器实在不安全。为解决这个问题,2000 年左右,海外一些技术狂人和鬼才程序员已开始埋头苦干,奋力研究如何更好保护大家的密码。


从那时起,独立的专业密码管理器不断诞生,包括较知名的开源密码管理器:Password Safe(since 2002)KeePass(since 2006)


第二代密码管理器带来真正的加密保护,有着独立的主密码。


扩展一下:为什么加密如此重要?


因为良好的加密设计可以确保当前的计算机水平无法破解。


密码管理器一般都使用对称加密算法(至于非对称加密算法,本文不展开),就是加密和解密都使用相同的密钥 key




密码学设计认为:


  • 加密算法 encrypt/decrypt 无法保密,黑客可以知道;

  • 使用密钥 key 可以很容易从密文 cipher 解密得到明文 plain(要保护的数据),没有 key 就不行;

  • 要求保护好密钥 key,要求密钥 key 完全随机,防止黑客破解。


目前,最流行的对称加密算法是 AES(Advanced Encryption Standard)。根据密钥key的长度分为三个级别:128/192/256 bit。其中,AES-256 作为最高级别的算法,广泛应用于金融、军事等领域,也被很多密码管理器采用。


有些密码管理器宣称使用军事级别等加密技术,一般是指使用 AES-256 算法加密。


然而,并不是使用最高等级的加密算法,密码管理器就达到最高的安全水平。黑客通常不会破解加密算法,只会尝试获得密钥 key

密钥生成

既然黑客最惦记密钥key,那关键就是怎样保护好密钥。一般来说,用户设置的主密码不能用作密钥key加密数据,不满足随机性要求。


比如,最低等级的 AES-128 要求至少 20 个完全随机的字符,没人能记住。


于是,密码学家们发明基于密码生成密钥的算法 PBKDF(Password-Based Key Derivation Function),将密码转换成很长又完全随机的安全密钥,就可以加密数据。


目前,推荐的算法是 PBKDF2,而 brcypt、scrypt 等算法也有应用。


尽管每个算法的具体细节不同,但基本原理都一样。如下,



这里的salt很关键,它完全随机。因此,即使通过很简单的密码,也能通过单向 Hash 函数计算出完全随机的key作为密钥,满足加密要求。


salt 应该使用真随机数生成器(True Random Number Generator)生成


用一句话来解释:通过主密码生成保护数据的安全密钥key

暴力破解

黑客是否可以使用暴力破解密码?


密码学算法都是公开的,黑客也能使用同样算法,不断尝试,总能算出那个相同的密钥 key,然后解密出数据原文。


为应对暴力破解,PBKDF 算法并不像普通的 Hash 算法那样快,相反它被故意设计成很慢(或者需要消耗较多计算资源)。


PBKDF 还可以设置迭代次数 count,开发者能根据当前计算机硬件水平选择合适的迭代次数。PBKDF 算法推荐设置为 10000 左右。


这样,黑客想暴力破解,消耗的计算资源也就增长 10000 倍。


不过,也不要将迭代次数 count 设置为 1000000,否则用户输入主密码时要计算很久。


用一句话解释:生成密钥的算法很消耗计算资源,这提高了暴力破解的难度。

核心算法

我们将前面的知识串起来,就是第二代密码管理器的核心算法设计。


1.设置主密码



用户设置主密码后,密码管理器通过 PBKDF2 生成了加密密钥 key,并且把参数 saltcount 保存起来 KeyFile


  • 密钥 key 用于加密数据,只在程序运行中使用,并不保存

  • KeyFile 用于解锁时生成密钥 key


这里要强调,不保存主密码!不保存主密码!不保存主密码!


用一句话解释:通过主密码生成安全的加密密钥 key ,并且保存密钥生成算法的参数。


2.加密数据



加密后,把加密的参数 IV(Initial Vector) 和密文 cipher 一起保存下来 CipherFile。密钥 key 和被保护的数据明文 plain 不保存。


  • 一句话解释:使用安全密钥加密数据,保存密文(加密后的数据)。


3.解密数据



解密即把前面两个步骤反过来:


  • 先从 KeyFile 中读取 PBKDF2 参数 saltcount,经过同样的计算得到密钥 key

  • 再读取加密参数 IV 和 密文 cipher,使用 AES 解密算法得到原文 plain


用一句话解释:按照同样方法从主密码生成密钥 key ,再使用解密算法从密文解密出原文。


在实际应用中,每个密码管理器都可能做一些独特的设计和扩展。


比如不直接使用密码生成的密钥 key 来加密保存的数据,而是加密另一个密钥 key2,再用 key2 来加密真正要保护的数据。

第二代安全技术

第二代密码管理器技术特点:


  • 使用 PBKDF 算法,从主密码生成安全的密钥 key

  • 使用高强度的加密算法(如 AES)加密数据

  • 不以任何形式存储主密码


AES 加密算法本身很安全,但只要选取合适的密钥生成算法(如 PBKDF2) + 真正随机的 salt + 合理的迭代次数 count,第二代密码管理器就极难被破解,除非黑客能破解主密码。


相比第一代密码管理器,第二代密码管理器安全水平大大提升,只要保护好 主密码,就能保证数据安全。并且,第二代密码管理器使用主密码加密数据,真正提升了数据安全性,这是一个巨大进步。


今天不推荐用小本子记密码或用浏览器保存密码,因为密码没得到多少保护。


保存密码,至少使用第二代密码管理器。

假二代密码管理器?

有一个事实是,并非设置主密码就是第二代密码管理器。虽然很多市面的密码管理器声称使用军事级别加密,但大部分仍停留在第一代的设计水平。


TeamSIK在 2016 年找到一些密码管理器的安全漏洞,从公开披露的信息中可以得知它们的设计水平。


注意:我们只能判断漏洞修复前的设计水平,开发商有可能在修复漏洞时改善设计。


1.SIK-2016-020 My Passwords 披露的主要信息:


The app stores an encrypted version of the user’s master password (“master_key”) in the shared preferences file.

With these two values, it is possible to reconstruct the user’s master password and log into the app. The attacker can thus extract all of the user’s stored passwords.


点评:My Passwords 使用了一个很弱的自创加密算法,加密并保存主密码,安全性远远不如第二代密码管理器不保存主密码的设计。


2.SIK-2016-021 Mirsoft Password Manager 披露的主要信息:


The master password is stored in an insecure way. The password is encrypted, but the key for this encryption is part of the application code (equal on all devices).


点评:Mirsoft Password Manager 使用了写死的密钥,加密并保存主密码,违背了密钥应该保密的原则,而且也不应该保存主密码(即使是加密保存)。


3.SIK-2016-022 LastPass Password Manager 披露的主要信息:


The master key and the PIN are symmetrically encrypted and stored in a shared preferences file in the local app folder. The key/PIN are stored encrypted. The key for encrypting/decrypting the credentials is hard coded into the application’s source code.


点评: LastPass 是非常流行的密码管理器,和 Mirsoft Password Manager 一样使用写死的密钥,加密并保存主密码,同样属于第一代设计水平。


4.SIK-2016-026 Keeper Password Manager 披露的主要信息:


If the user is logged out the master password has to be entered to access the passwords in the app.

By entering the password incorrectly once the adversary can select “Forgot Password” after which a verification code has to be entered.

The app then fails to show the login activity but shows an empty password list with a different background. When spawning the com.callpod.android_apps.keeper/.DeepLinkActivity it is possible to add new passwords without providing the master password. When adding new passwords a user is able to attach files to the entry. An adversary could abuse this by attaching malicious files to the password entries. A user might wonder what these files contain when using the keeper desktop application or the online service. This can trick the user to execute code on his machine.


点评:黑客没有输入主密码,也能够保存数据到 Keeper 里面。从这个漏洞描述来推断,数据很可能没有经过主密码生成的密钥加密,不符合第二代密码管理器的安全特性。


5.SIK-2016-027 F-Secure KEY Password Manager 披露的主要信息:


The master password of this password manager is stored in plain text in the local app folder.


点评:F-Secure 是一家历史悠久的安全公司,旗下的密码管理器产品竟然犯下明文保存主密码的低级错误。只能说,他们知道怎么杀病毒,但完全不知道怎么保护密码。


目前,以上漏洞都已修复。

小心网络密码管理器

密码只需保存一次,即可自动同步所有终端设备,虽然方便,但也危险。


按照第二代密码管理器的方法设计,加上网络同步功能:


  • 在设备 A 上创建主密码并保存 saltcount,加密数据;

  • 通过网络/云服务,将保存的 saltcount 和加密后的数据同步到设备 B;

  • 设备 B 上输入同样的主密码,有 saltcount 生成密钥,解密,查看保存数据;


这就是所谓的端到端加密(End-to-end Encryption)技术。你只能在终端设备上查看信息,而中间的传输网络无法解密。


如果网络密码管理器能重置主密码,那就要小心。


是重置主密码,不是修改主密码


既然加密密钥key只能通过主密码生成,在不提供主密码的情况下,服务提供商如何帮你重置密码?


答案是服务提供商很可能帮你保管加密密钥。

怎样设置主密码?

既然安全的关键是主密码,那怎样设置?


斯诺登建议使用密码短语(Passphrase)。本文建议使用一整句话作为主密码,比如


Isetupmymasterpasswordin2020
复制代码


2020nianWuhanbaofalebingdu
复制代码


从信息量的角度计算,16 个大小写字母和数字组合,与 12 个字母、数字、符号组合的强度差不多。当然,你也可以在末尾加上标点符号。


从暴力破解角度看,如果黑客不知道你的密码长度,通常会按照密码长度递增方式尝试破解。密码越长,暴力破解的计算资源越多,这也增加破解成本。

主密码的安全问题

想要第二代密码管理器能真正保护密码安全,主密码应满足两个条件:


  • 足够长,足够强

  • 不能被别人知道


遗憾的是,现实中它还是会遇到很多问题:


1.主密码强度不够


很多用户并不知道主密码需要很高强度,也不知道怎样设置高强度的主密码。怎样设置主密码


2.主密码被泄露


例如在输入主密码时,可能被不怀好意的人偷窥、被电梯摄像头录制下来、被设备上的恶意 App 录屏等等。


3.主密码会被重用


鉴于记忆密码太困难,以至于不少用户会重用主密码。重用主密码有很大的安全风险,一方面,这增加了其被偷窥的机会;另一方面,很多互联网服务安全性并不高,一旦某一个互联网服务泄露密码,那密码管理器的主密码就暴露了。


即使是密码管理器厂商,也有可能被入侵,比如 LastPass Security NotificationLastPass Hacked


此外,互联网服务也会泄露密码。目前,已有很多互联网服务提供商泄露密码。have i been pwned 收集的泄露记录已超过地球人口总数,近 95 亿。



在下一篇文章中,我们将介绍第三代密码管理器和第四代密码管理器。


密码管理器的进化史(下)


2020-03-09 14:375104

评论 1 条评论

发布
用户头像
第二代 加密, 为了不存储主密码,加了一层,为了不直接存储明文,再加密一层,两次包装的核心还是算法可以逆向计算出缺失的参数/因子。个人理解 不知道对不对。
2020-03-09 15:54
回复
没有更多了
发现更多内容

图表示学习+图神经网络:破解AI黑盒,揭示万物奥秘的钥匙!

博文视点Broadview

Chia奇亚云算力挖矿系统开发成功案例丨Chia奇亚挖矿源码成品

系统开发咨询1357O98O718

fil云算力系统开发具体流程丨fil云算力开发源码成品

系统开发咨询1357O98O718

Spring Cloud Alibaba 实战

Damon

微服务 SpringCloud Alibaba 6月日更

拉仇恨!webhook + 企业微信给同事做了个代码提交监听工具

程序员小富

Java GitHub 编程 程序员 代码

云网络开山之作,揭秘云上高速公路的十年技术成果!

博文视点Broadview

C 语言面向对象的封装方式

实力程序员

国内首篇云厂商 Serverless 论文入选全球顶会:突发流量下,如何加速容器启动?

Serverless Devs

Serverless 容器 云原生

NQI质量基础设施“一站式”服务平台开发解决方案

源中瑞-龙先生

开发 解决方案 NQI 质量基础设施“一站式”

总结笔记 Datawhale-23期数据挖掘-心跳信号分类预测

万里无云万里天

数据挖掘 6月日更 Datawhale

书单 | 5月畅销新书情报,你最Pick哪一本?

博文视点Broadview

react源码解析3.react源码架构

全栈潇晨

React React Hooks react源码

LeaRun .Net Core/Java工作流引擎,分离式前端,升级Vue

雯雯写代码

Vue 工作流引擎

chia奇亚挖矿系统开发案例介绍丨chia奇亚挖矿源码功能

系统开发咨询1357O98O718

火爆全网的迁移学习简明手册全面更新,重磅出版上市!

博文视点Broadview

云上创新,阿里云视频云分享全场景音视频服务背后的场景探索与技术实践

阿里云视频云

阿里云 音视频 在线教育 视频会议 直播技术

40 图|硬核解析用 Mac M1 玩转 SpringCloud

悟空聊架构

Spring Cloud Mac SpringCloud Alibaba m1 6月日更

Rust从0到1-泛型-trait

rust 泛型 Trait generic

毕业设计So Easy:珠穆朗玛FM音频电台APP

不脱发的程序猿

android 软件开发 APP开发 毕业设计 移动应用开发

一封MySQL之父Monty的回信,开启彭立勋的数据库之路

华为云开发者联盟

MySQL 数据库 opengauss GaussDB 华为云数据库

【Flutter 专题】115 图解自定义 View 之 Canvas (四) drawParagraph

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 6月日更

基于开源Tars的动态负载均衡实践

vivo互联网技术

负载均衡 TARS

你的同事是你的竞争对手吗?

石云升

战略思考 职场经验 6月日更

华为云携手马栏山文创园助力湖南广电荣获国家广电总局多项大奖

华为云开发者联盟

AI 5G 视频 华为云 马栏山

🏆未来可期,WebRTC成为实时通讯方案的行业标准

洛神灬殇

音视频 WebRTC 实时通信 6月日更

anyRTC SDK 5月迭代:优化自定义加密功能,让通信更安全

anyRTC开发者

音视频 WebRTC sdk

[万字总结] 一文吃透 Webpack 核心原理

范文杰

大前端 webpack 6月日更

《面试官:谈谈你对索引的认知》系列之B+树

架构精进之路

MySQL 索引结构 6月日更

为什么说混合云是新基建的流行架构?

博文视点Broadview

Flink+Alink,当大数据遇见机器学习!

博文视点Broadview

自适应微服务治理背后的算法

万俊峰Kevin

微服务 自适应 服务治理 Go 语言

  • 扫码添加小助手
    领取最新资料包
密码管理器的进化史(上)_安全_神锁离线版_InfoQ精选文章