evol128[Blog]

I am the bone of my code

一个安全的个人密码系统

evol128 posted @ 2011年6月27日 19:43 in security with tags hash Security crypt , 2870 阅读

本文写于2011-05-28

一早发现我的gmail有从异地登录的记录,这让我很震惊。我自认为是一个很有安全观的人,密码这种东西一向是小心处理的;同时我也是一个懒人,所有网站都用了同一个密码。虽然我很莫名,但我不得不承认,我的密码在某时某地以某种方式泄露了。这次密码泄露对我来说损失惨重,我不得不手动更新了其它主要网站的密码。

痛定思痛,我决定启用一种更加安全的密码机制。其能够达到以下几个目标:

1.能够用大脑轻松记住密码或密码的构造方式

2.不同网站不同密码

3.即使密码泄露,也只影响到被泄露的那个密码,而不会被推测出其它密码

4.即使知道我的密码构成方式,也不能破解我的密码

5.即使有人通过某种神通广大的方式获得了我的所有密码,他仍然不能破解我的密码

 

基本思路:one way hash, 单向散列加密,不清楚的朋友们可以参考一下wiki (http://en.wikipedia.org/wiki/Cryptographic_hash_function)。我们平常用的md5,sha256都是比较出名的hash算法。

简单说来,这种加密算法有2个特性:

1. one way单向:就是说你没有能力(这里我避免使用“不能”这个说法,如果有几千年的寿命应该可以吧,呵呵)去根据密文来破解明文,不管给你多少信息都不行

2. collision free冲突免疫:你没有办法构造2段明文来让它们的密文相同

这样,一旦我用hash加密了我的密码,然后把密文当做新密码的话,任何人都没有办法破解我的密码

 

具体方法:

工具: hash generator(网上随便下,千万别用在线版,你发出去的http请求可不会加密),字母表转换器(自己写)。通常hash函数是将一个字节流映射到另一个字节流的,我们必须把结果转化为能够从键盘输入的字符流。

方式:alphabet(hash(key, website))  把网站名也hash进去就保证了每个网站密码不同

 

Avatar_small
依云 说:
2011年6月27日 19:51

这个主意好。不过有个问题:手工输入太麻烦了(GAE 的上传工具从来不记住我的密码。。。。)。

另外,我觉得密码应该有不同的密级。想想,如果你处于一个不安全的环境,但又必须登陆你的某个帐户。hash 生成的密码很难记,因此你需要重新使用你的 secret 来生成你的密码。这时候,你的 secret 和算法就可能被泄露。(是不是太极端了?)

Avatar_small
evol128 说:
2011年6月27日 20:32

@依云: 可以复制粘贴的,还防止别人在键盘上做手脚呢。只要key不泄露这个算法就是安全的,记住一个key不算难吧……

Avatar_small
evol128 说:
2011年6月27日 20:37

@依云: 的确有这么一种可能:我的电脑已经被totally干掉了(root权限被获取),那么在输入key的时候很有可能会被窃取。这我真没办法应对,我觉得任何人都没办法应对……

Avatar_small
依云 说:
2011年6月27日 21:44

@evol128: 我是说,手工输入 key 和那个网站信息,然后才能得到密码。复制粘贴就更不安全了,在 X 下的程序基本上都有能力截获。

我是指这样一种情况:你需要登录某帐户以获取某个信息(比如你老板让你登录公司网络拿份资料,而你需要使用的系统或者信道公司拥有完全的权限)。这时候这个帐户的安全并不是问题,但你的方案会泄露不必要泄露的信息,你的其它帐户也有危险了。

Avatar_small
evol128 说:
2011年6月27日 22:54

@依云: 我明白你的意思了……有一个折中的方案是在智能手持设备上算密码。还有一个更保险的方式是不要使用不安全的电脑

Avatar_small
λ 说:
2011年6月28日 23:36

@evol128: 呃,好蛋疼…… 若要人不知,除非己莫为。其实还是不太看得懂你们两个的讨论-_-b

Avatar_small
网课代修 说:
2024年1月12日 14:28

留学生在国外学习,除了需要面对语言障碍和文化差异,还经常面临着各种琐碎的学业问题。而其中最为棘手的问题莫过于网课代修。不少留学生都曾遇到过这样的情况:面临繁重的课业压力,无法兼顾各门课程的学习,于是开始寻找网课代修的解决方案。


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter