主页 > J级生活 >用什幺样的密码比较安全呢?从基础谈起! >

用什幺样的密码比较安全呢?从基础谈起!


2020-07-24


用什幺样的密码比较安全呢?从基础谈起!
Antoine Vincent Jebara, of Myki, demonstrates his password manager app during the Startup Battlefield Competition of the 2016 TechCrunch Disrupt in San Francisco, California, U.S. September 13, 2016. REUTERS/Beck Diefenbach - RTSNMHI

今天来讲一下各大网站保存密码的方式。如果你是工程师,而且知道 hash + salt 是什幺意思,可以直接跳过这篇文章。如果非电脑科学领域的人,只是来凑凑热闹,那可以直接往下拉到结论,我直接告诉你,你的密码安不安全?

Hash your password

如果你在做一个网站后端开发,一位使用者创帐号的时候,你要用一个固定的 hash function 在资料库里存 hash 过后的密码,每次使用者登入的时候,把使用者给你的密码 hash 之后,看看跟你资料库的那个一不一样,因为 hash 是不能 reverse 的,所以即使哪天资料外洩,骇客也无法知道你的明码。

听起来挺 OK 的啊?

一开始的确是没什幺问题,所以一开始网站没有给太多密码複杂度的限制。但随着记忆体空间越来越便宜,骇客可以先把所有可能的 hash 结果存起来,再一一比对他从资料库拿到的 hashed_value 跟他先算好的表有没有吻合,如果能成功对应到你的密码,就等于被破解了。

光说不练假把戏,来点数学吧!十年前安全性没人要求的时候,一般人的密码都挺短的,而且都是英文 + 数字。假设长度是 7 的话,那所有的可能明码也才 ^7 种,假设现在是用 md5 hash:

意思是我要存下所有的 mapping,其中 1*7 是明码,128/8 是 hash 过的密码 byte 大小。在 2017 年,这个容量简直轻鬆愉快啊!那幺该怎幺办呢?

Salt

这个时候就需要加点随机的东西,增加乱度了。解法就是在每个人创帐号密码的时候,随机生成一个字串,加在明码后面或是穿插明码其中,Verify 的时候也一样,只要伺服器记得每个人的随机字串就可以:

最好连 salt 的长度也是 random 的,这样的话骇客就必须所有的长度都有个表,那其实更快的方式是直接把 username 或是 email 加进来 hash。基本上就是增加原本字串的难度,毕竟所有 md5 的 output 是 2^128,没有一个 machine 可以记得了所有的 input,而增加难度最简单的方 就是增加长度,长度每加一,难度变 36 倍。

另一种就是增加可能的字母,加上大写、加上特殊符号,底数直接从 36 -> 94,那自然就更难了。

所以为什幺大网站都会要求你用长度最少 12 的密码,最少要有一个大写、一个小写、一个特殊字母、一个数字,这样如果 hacker 万一哪天破解了这个网站的资料库,拿到了 hash 过的密码,大概未来一、两年内,都还不会有事。如果再加上 random长度的 salt,基本上就不太可能用这种暴力法破解。

问题

Q:既然 salt 是存在资料库的明码,那迟早有一天记忆体大到可以 cover 长度 10 的密码,那再把它减去 salt,不就得到 user 的密码了吗?

A:所以 salt 有两个目的:其中第一是让 hash 前的字串总长度拉长,这样即使使用者给的长度不够,还是可以增加暴力破解的难度。

举个例子,如果 user 密码长度是 10,salt 长度是 5,那总长度是 15 的密码,就不太可能用建表暴力解再减 salt 的方式。

Q:总长度 15 的不好建,10 的总可以了吧?他不就可以把所有排列组合 + salt 建表吗?

A:答对了!这就是为什幺 salt 要 random!

salt 的第二个目的,是可以把损失降到最低。那个骇客一次还是只能破解一个人的密码,因为他必须对每个新的 salt 重新建表,这样可以帮资安部门争取时间,叫使用者赶快改密码。

如果我是骇客

当然不是说什幺顺便 hack 生日这种资讯,排列组合猜一猜,这是要猜到什幺时候?这个部落格怎幺可能讲出这幺没格调的话?

基本概念很简单,因为大家懒。十年前大家需要办帐号时都有过密码,而当时对于密码的要求不高,所以很有可能大多数的密码都只有小写英文。然后呢?之后安全意识抬头,大家要求要有大写字母和特殊字元,可是大家又不想改原本的密码太多,所以就很简单的加在原本的密码后面。考虑这些历史因素的话,我就会先创建所有的可能密码的 hash,大概长这样:

我相信这样应该会中一些,但如果网站有加 salt,那就什幺都不管用了,这就是为什幺你身为开发者要加 salt 的原因,就像短版效应一样:

结论:讲这幺多,所以我的密码到底够不够强呢?

大概念就是:越长越好。这是最重要的因素,其中穿插大小写互换跟数字,然后特殊符号穿插其中,虽然很麻烦,但打一下就习惯了。

所以你的密码到底有多安全呢?长度 10 都是英文小写,跟长度 8 但可以有特殊符号,哪个比较安全呢?

简单的计算方式就是:

*^n

n 是密码长度

26 就是只有小写英文

36 就是只有小写英文 + 数字

62 就是只有大小写英文 + 数字

94 就是只有大小写英文 + 数字 + 特殊符号

我的经验法则是:如果你的数字小于 10^24,那大概就跟 Jon Snow 一样:

用什幺样的密码比较安全呢?从基础谈起!

那强烈建议你,换个密码啰!



上一篇:
下一篇:


小编推荐