写在前面

  • 如果你记得住密码,那这个密码一定是不安全的。
  • 如果你没有使用一个密码管理软件/硬件来管理密码,那你的密码管理策略一定是不安全的。
  • 保护密码本身没有意义,不要依赖于密码强度、定期更改密码来保证账户的安全性,应当使用多因素认证或者靠谱网站的风控系统。

前言

密码基本上每个人每天都会输入N次,密码被窃取会导致别人获取到你的个人信息和数据,或者以你的身份执行非期望的动作。密码的安全性需要网站提供者、个人、认证方等相关方共同维系。对于个人而言,虽然你可以选择靠谱的网站登录,但是有些是你无法控制的,这篇文章更多偏向个人如何保护自己的密码。

在说到密码管理策略之前,什么样的密码才是最安全的密码?

长度超过8位,英文大小写,数字,符号组合,不重复,不连续,跟账户无关,定期修改的就是高强度的密码么?不是的,最安全的密码当然是没有密码

无招胜有招

手中无剑,心中也无剑

No code is the best way to write secure and reliable applications. Write nothing; deploy nowhere.

没有密码了,你怎么偷我的密码?

那没有密码是怎么做到的呢?

2019年3月份,W3C与FIDO联盟正式推出Web认证标准推动安全免密登录,主要浏览器和平台均已内置支持新的Web认证标准,通过生物识别、移动设备以及FIDO安全秘钥来实现便捷且安全的线上登录。

WebAuthn

其实没有密码不是真的没有密码,只是密码以另外一种方式存在在某个地方,这其实是密码安全性和使用便利性的一种平衡。

如果用了WebAuthn的使用场景是如何的?

  • 注册时,输入你的账户,网站判断账户未被注册,提示你可使用符合WebAuthn协议的认证器。
  • 你通过移动端的指纹传感器,Yubico Key的触摸,输入PIN,Windows Hello,苹果刷脸等等解锁认证器
  • 认证器创建一对针对本地设备、网站URL、账户多元素的全新公钥和私钥密码对。
  • 浏览器或系统将公钥发送给网站服务器,并将其与用户的账户关联。注册完成。

  • 登录时,输入你的账户,选择符合WebAuthn协议的认证器。
  • 网站服务器向浏览器或者系统发送挑战字符串(challenge)
  • 你解锁认证器,认证器用私钥签名挑战字符串发送给网站服务器
  • 网站服务器根据签名过的挑战字符串和账号的公钥进行验证,如果可以解开,则登录成功。

这中间你所做的只是,输入账户,按一下认证器。

这就是无密码注册登录流程,非常得丝滑。

这中间依靠计算机通信安全的基石RSA算法,没有任何密码在互联网上被传输。即使网站服务器被人攻破,数据库被人拖库,黑客拿到的也只是你的公钥,无从撞库。

WebAuthn如何保证安全

  • 没有密码在互联网传输。
  • 可以抵抗钓鱼网站。由于协议和浏览器等保证了,只有特定的网站URL发送的挑战会被响应,钓鱼网站无法发起挑战。
  • 抗重发攻击。使用随机的挑战字符串。

你所担心的WebAuthn

我的私钥会不会被读取

私钥被硬件保护无法被读取。以YubiKey为例,私钥只能被写入,无法被读取,这已经从硬件上进行了保护,你只能传入一段字符串让YubiKey使用私钥来签名,无法读取私钥。市面上也有些密码管理器可以备份私钥。

无密码登录,如果我的私钥丢失怎么办

私钥保存在手机、YubiKey等地方,而且无法备份,如果丢失了,你实际上将失去账户的控制权,怎么办?

没有办法。如果是企业内,你可以找管理员重新生成一个私钥,但是互联网,你必须在网站服务器登记多个访问方式,比如设置密码,设置取回密码,设置多因素认证,设置多个认证器。所以真正的注册实际上还有其他流程,但是这个注册只是一次性工作,登录可以无密码。

我们以Dropbox来看看。

  • 最基本就是一个密码登录。
  • 接着为了安全性,你可以设置两步验证(双因素认证、2FA),在你登录或者登录后做敏感操作时需要输入一个PIN。这个PIN可以通过短信或者TOTP设备发送。
  • 为防止手机或者OTP设备出错,还可以再设置一个备用手机,赠送十个一次性紧急备用代码。
  • 再添加一个或者多个Security Key(这里是登录无密码的关键)。

所以你如果丢失了私钥,可以通过其他方式登录,解除丢失的设备,绑定新的设备。但是网站很多,确实工作量有点大。

我的认证器被人偷了怎么办

如果是随机的丢失,由于捡到的人不知道账户,所以也是无法登陆了。如果被特意窃取,那确实对方可以直接登陆网站,为预防这种情况你可以对设备添加一个PIN码或者其他生物认证方式,比如指纹,人脸,虹膜等等。PIN一般是一个6位数字。听起来好像又是一个密码?不是的。PIN从不在互联网传输,所以可以非常得简单。PIN可以防止暴力破解,比如手机指纹错误几次锁定一段时间,Yuboco Key的PIN和PUK错误3次就会自我销毁。

资深一点的Linux系统管理员看到这里应该很熟悉,很多人其实已经一直在用了,公钥私钥免密SSH登录服务器,GitHub登录等等。所以说WebAuthn本质上没有新意,但是他的价值在于,有一帮标准制定者、操作系统、浏览器厂商、大公司愿意在WebAuthn框架下面一起玩。随着操作系统、浏览器生态的慢慢发展,各种服务端语言SDK的完善,未来一定会有越来越多的网站支持无密码登录。

说完了没有密码,再来说说

有密码的安全性

如果你要对你的密码管理策略再提升一个等级,你必须使用一个密码管理工具来管理,比如KeePass、Bitwarden、LassPass、1Password甚至passwordstore.org的pass使用gpg自行管理等等随便搜索一大堆。需要注意的是,提交到Web的密码保险箱不一定靠谱,除非在客户端加密后上传。客户端最好是开源的,代码经得起审计,比如Bitwarden,可以私有化部署,服务端和客户端均是开源的。

不要向公众告知你的密码管理策略

永远不要向任何人透露你的密码管理策略,比如我,从来不向任何人说我使用KeePass管理我的密码,我的密码取回邮件账户是this-is-my-fail-safe-email-account@qq.com。

你的密码一定会泄露

就像应急响应一样,你一定要假设你的密码或者密码数据库有一天会泄露,提前考虑泄露会造成的风险,减低泄露的损失。

尽量减少密码记忆个数

用手机号码注册,使用验证码登录,虽然这不是太安全,但是很多人都是这么用的。

登录可以使用大厂提供的联合登陆,当然也会出现以前某东可以使用某付宝登录,然后因为竞争关系,登录选项被切断。

但是联合认证有存在问题。首先这个认证方必须公信力非常高,否则他是可以登录任何人。

最近我发现某运营商在推基于网关认证的免密登录,原理是通过运营商网关可以获取到手机号码,对接的App就可以实现本机手机号码直接登陆。在我第一次使用的时候还吓了一跳,因为登陆界面跟App结合非常紧密,风格也跟App一致,登陆手机号码中间四位打码,我开始以为是运营商将手机号码打码后直接提供给App方,后来查了SDK才知道,这个登录授权页面其实是运营商服务器的页面,页面支持个性化定制,但是限制了不能运行JavaScript等脚本,App方拿不到打码后的手机号码。这样子安全了一点。

如果要更安全,当然是类似微信这种装机量比较大的App,要登录时直接弹出App自身的登录授权界面最安全,而某运营商的这个登录模式实际上会给部分隐私敏感度比较高的用户造成困扰。

尽量减少密码输入的次数

每次输入密码,都可能被本地按键监听,被人在后面偷看,或者在互联网传输被监听。

如果你在某个站点尝试密码错误,就不要傻傻将所有密码都试一遍了,因为有可能导致密码被记忆。

不要认为你没有价值

很多人认为自己没什么值得偷得,所以某些不重要的系统使用了弱密码,但是黑客有可能使用你的弱密码进入系统,虽然你没有什么价值,但是利用系统漏洞在内网横向移动,最终追溯也会牵涉到你,给自己带来不必要的麻烦。

而且有些黑客会使用你的身份,比如发邮件或者短信诈骗你的亲友。

用一个密码管理其他密码是否安全

用一个密码来管理其他密码说实话也不是太安全,如果一个密码泄露,所有密码一锅端,但是他带来的所有账户随机密码的安全性比所有账户同一个密码的安全性更高,而且实际上我们本身已经在用了,比如你的电脑或手机的开机密码,就是一个密码管理其他账户的案例。

密码管理工具KeePass的安全性

首先是你要安装到从官方渠道下载到的安装文件。

  • 整个密码数据库文件以AES256、Twofish算法加密,也就是你可以给任何人你的密码数据库,如果没有Master Key对方也是打不开,所以你可以放心地在多个云平台同步你的密码文件。
  • 运行时内存保护,注意的是,在任何环境下,内存对超级用户总是可见的,如果休眠后,内存也会被转储到文件。
  • Master Key输入框有防止键盘记录器功能。硬件USB hack不算。。。
  • 自动输入支持混淆输入,可以一半用键盘,一半拷贝黏贴。
  • 可以控制KeePass无法联网,再SB一点你可以用虚拟机在虚拟机里面打开。
  • 密码数据库文件可以使用Master Key和一个随机的任意文件Key File来保护。Master Key记忆在脑袋里,但是强度不够,Key File强度足够,但是需要有个物理位置存储。你可以选择将Key File放在跟密码数据库不同的位置,或者放入USB,或者使用类似Yubico的挑战。如果你丢失了任意一个,则密码数据库将无法打开。

配置浏览器自动登录

尽量不要所有站点都用同一个密码,这会导致密码被撞库。不同站点使用不同的随机密码。配置浏览器自动填写账户名和密码。

KeePass和浏览器通讯建议使用Native messaging而不是TCP。

随机密码不要太SB

不要使用随机密码让你自己分不清L、I、1、o、O、0,而且在移动端输入要考虑友好性,尽量不要多次切换输入法大小写标点符号。

密码文件分级

对账号密码进行分级,生活的可以分为垃圾账户、中等账户、高等账户(资金相关),工作的一个独立的密码文件,因为你可能因为出差临时需要将密码文件托管给B角。

对于垃圾账户,可以直接交由浏览器或者免费的在线密码管理工具直接管理。

密码二次加密

密码数据库虽然目前无法被破解,但是总有一天会被破解,所以非常重要的密码可以自行再做二次加密。

做好备份

如果Master Key或者Key File丢失密码数据库无法打开,为防止极端情况,所以定期应当将密码导出自行加密备份。

安全问答和取回密码

取回密码的邮箱一定是非常用的,建议独立申请一个邮箱,并定期登录检查可用性。

安全回答不一定真正回答正确的问题,比如问题是你爱人的名字,就输个情人的名字。

区分工作邮箱和生活邮箱

一定要区分工作和生活,划分一个清晰的边界。即使你在事业单位,邮箱也不能保证一辈子都是你的。而且有些工作邮箱有存档机制,作为公司资产被公开。所以注册账户的时候尽量不要使用工作邮箱,也不要使用境外邮箱。

定期更改密码

有研究表明,定期更改密码会导致密码更不安全,如果用户不是使用密码管理软件来管理密码的话,那他们定期更改的密码会有一个模式,导致定期修改密码的意义丢失。所以建议只有认为自己密码已经泄露的情况下再去更改密码。

记忆密码

如果你确实要记住密码,建议可以使用唐诗、编程语法、名句等等首字母,再进行替换,替换可以是字母同音同形替换、故意错误替换、字母位替换等等,比如很有名的ppnn13%dkstFeb.1st(娉娉袅袅十三余,豆蔻梢头二月初)等等。

如果一定要用自己的生日,建议错位几个数字,比如第5年生日那天,生日的下一个月第5天。

客户端的安全性

这些常规的安全素养太多了,要说可以说几天,这里随便提一些。

尽量避免在有摄像头的地方输入密码,比如银行、超市、电梯。即使背对着摄像头,也是可以根据手机细微的抖动或者反光推测出密码的。

未加密的VPN环境、HTTP环境、WiFi环境、陌生电脑环境,如果要登录,尽量使用扫码登录,不要输入密码,即时要,可以在手机端更改个密码再登录。或者登录完修改密码。

手机一定要有密码或者指纹等保护。其实指纹安全性也不高,真手机被偷了,整个手机满地都是可解锁的指纹。

手机SIM卡设置PIN和PUK码,防止有人借你手机拿根针把SIM捅出来插到别的手机来登录。

电脑应该全盘加密,否则黑客如果可以物理接触到你的电脑,可以把硬盘拔出来,或者U盘启动,替换篡改过的密码管理软件。离开电脑要锁屏,BIOS要设置密码,必须安装反病毒工具。

介质销毁,比如测试过的某些设备要恢复出厂模式再退货或者丢弃。

小心钓鱼网站

小心钓鱼邮件。

不要随意扫码

这有点类似预防CSRF,靠谱的扫码都是,扫完后会让你手工确认是否做什么操作。以前发生过案例,别人发过来的扫码实际上是某个App的登录扫码图片。有些比如签到系统,扫完后会自动签到,如果换个场景,其实很不安全。

不要托管你的密码

有些抢票或者校园的第三方应用会让你保存密码,帮你在特定时间登录执行操作,尽量不要。有些应用即使你更改密码也无法清除别人已经登录的状态。

传输密码通过两个渠道

如果你需要告诉别人某个密码,可以QQ发前面一段,打电话告知后面一段。

关注不常用的系统

有些系统,不管你有没有注册,其实里面已经有你的信息了,比如医保卡、水电费账户、小朋友在安全平台上做作业的账户,这些账户由于没有银行网点那么多可以实名交付初始密码,所以很多都是跟身份证有关的弱密码,不要以为你没用没关系,这些系统都需要去登录,更改掉弱密码。我还遇到很多系统管理员,用着系统,有些默认Admin、Audit等账户从来没用过但是是弱密码。摄像头等也一样。

客人WiFi

有些客人会将WiFi密码共享到互联网,所以需要注意家里WiFi密码设置。

如果你看到这里,建议你立刻开始,使用一个密码管理工具,花一个月时间梳理你的账号资产,迁移到安全的密码管理策略上来。