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

所属栏目:Q滴生活 2020-07-24 19:49:39 来源于:http://www.sb9975.com
用什幺样的密码比较安全呢?从基础谈起!
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 一样:

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

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

相关文章
申博太阳城_娱乐天地线路客服|高品质生活服务网|以便捷乐趣为宗旨|网站地图 和乐线上国际 金沙集团6556