密码学本身是加解密口令的办法(cryptology),而日常密码准确来说是口令(password),甚至可以理解为有效期由用户决定的验证码。

对于验证码,普通用户最熟悉的可能是“请在X分钟内完成验证。为保证账号安全,请勿泄漏此验证码”。

这样可以来理解,普通用户理解中的“密码”(口令)也就是由自己决定有效期的验证码。同样要求不能泄漏(保密),而这种保密要持续到这个“密码”失效(也就是自己改密码)。

那么,口令和密码有什么区别呢?我有一个口令,是“12345678”,因为这是大家都能够理解读懂的,因此称明文。使用常见的md5算法加密之后就是“25d55ad283aa400af464c76d713c07ad”,这个东西就是密文,或者密码。为用户安全考虑的公司不会将用户的口令直接存到自己的数据库中(即所谓明文保存),而是会采取一定的算法加密用户的口令,获得密文,然后将密文存入数据库。因此你的口令对于该公司来说就是密码。

那么,为什么会说“12345678”这样的口令很愚蠢呢?因为即使是不可逆的算法,也必须遵循一条铁律“同样的输入一定有同样的输出”。我虽然不能理解“25d55ad283aa400af464c76d713c07ad”是什么意思,但当我知道①这就是密文,②它是通过md5加密的(编码算法)。那我就能穷举出明文。“1”的密文(md5算法,下同)是“c4ca4238a0b923820dcc509a6f75849b”,“2”的密文是“c81e728d9d4c2f636f067f89cc14862c”,……,最终我发现,“12345678”的密文是“25d55ad283aa400af464c76d713c07ad”。于是我破解了你的密码。

程序员不重复造轮子,当同一个编码算法中越来越多的明文(输入)与密文(输出)对应起来,破解就越来越容易。


那么怎么应对?首先注册账号所在的公司有责任保护好服务器和数据库,有义务使用可靠性更高的加密算法。对于我们来说:

  1. 应该不用弱密码(弱口令),避免直接被检索出密文。
  2. 在某些网站遭遇攻击事件后更换自己的口令(赶在被破解前,这就是为什么大公司需要及时披露自己被攻击和暴露用户密码库范围的原因)。
  3. 不在多个网站使用同一个密码,使用同一个密码减轻的不仅仅是你自己的负担,还有骇客。

那么什么样的的明文才造成了弱密码呢?“简单的输入必定带来简单的输出”。加密算法并不智能,也不会个性服务,因此你输入的参数少,那么穷举就越轻松。

参数有哪些?①字符长度,即密码的位数,位数越多破解越难;②字符种类,即数字、小写字母、大写字母、特殊符号(某些类型的压缩包甚至支持uf8编码,也就是说支持汉字),种类越多破解越难。

数字一共有10个,大小写字母一共有26个,特殊符号视网站数据库支持而定。总之,越长、种类越多,就越难破解。可是怎么记住我的密码呢?


一个程序员(Ken Thompson)的思路。如果加密算法不可逆,也就是说必须通过穷举来破解。那么我输入的口令本身就是被加密过的呢?也就是真正的密码。

我们的密码为什么被叫做口令?因为我们从未想过掩饰它。生日、身份证号后几位、键盘相临键、一段数字、常数的某一段(π、e)、某个方程、名字及其变体(首字母缩写、拼音),尽管有人可能没想到,但这些东西本身是对所有人公开的信息。即使密码再复杂,也阻挡不了社工库和恶意追踪。

Ken Thompson的“难解”密码是“p/q2-q4!”,长度为8位,种类为3种,本质是国际象棋的代数记谱法加密。但这同样被暴力穷举,而非关联解密(通过这个兴趣猜测到),是因为长度不够,类型不丰富。


了解密码学的人应该怎样设置自己的密码?我不清楚别人,我也不清楚我算不算了解密码学。我的设置密码时是通过参考一种古典密码,以网站为密钥编码口令生成的密码,它包含四种类型(数字、小写字母、大写字母、特殊符号),长度超过8位。