作者littleshan (我要加入剑道社!)
看板C_and_CPP
标题Re: [问题] 请问一般程式是用什麽方式储存个资呢?
时间Tue Jan 11 14:41:03 2011
※ 引述《QQ29 (我爱阿蓉)》之铭言:
: 请教各位
: 一只程式如果要储存使用者的个人资料 一般都用什麽方式储存呢
: 假如要储存使用者密码
: 我自己是觉得不可能完全不处理就直接写成text 或是 binary
: 是怕说有人可以窃取到密码
: 但是我不晓得一般有什麽common approach 去处理这块
: 加密我也不懂
: 但真的要用加密吗?
: 还是就存成binary就好.....
: 谢谢
个资这种要随时做 search 的资料是不需要加密的
加密後你要搜寻比对时还要解密 速度会慢到爆炸
但使用者密码请一定要加密
如果密码也用明文去储存
个资外泄时所造成的伤害绝对是倍数成长的
ex. 使用者的银行帐户用了相同的密码
结果你们的个资外泄很可能造成他的银行帐户被盗领
把密码加密後储存虽然并不保证100%安全
但至少风险小很多
我不知道台湾的法律是否有规定这一块
但个人是认为应该明令规定线上服务的使用者密码不得明文储存才对
回到原题
密码通常是用 one-way hash 去加密储存的:
ex.
使用者输入 hello 作为密码
↓
程式使用 md5 演算法对字串 "hello" 计算 hash
↓
在档案中储存 "5d41402abc4b2a76b9719d911017c592"
↓
使用者输入了密码 X 试图登入系统
↓
同样使用 md5 演算法对 X 计算 hash
↓
检查算出来的 hash 是否刚好等於 "5d41402abc4b2a76b9719d911017c592"
md5 是满常用的 one-way hash
这类 one-way hash 通常满足以下的特性:
1. 相同的字串一定会计算出相同的 hash 结果
2. 不同的字串计算出相同的 hash 机率极低
3. 就算知道 hash 结果,要推算原密码也极为困难
前面两项特性使得使用者设定密码後
只有知道密码的人才能登入
第三项特性则是保护密码
即使有人窃取到 "5d41402abc4b2a76b9719d911017c592" 这个字串
他也很难推算出本来的密码 "hello"
md5 算是相当常用的 one-way hash
现成的 library 也相当多
但实际上 md5 并非无法破解
目前已有许多利用 md5 hash collision 伪造数位签名的案例
如果你的密码资料非常重要
可以考虑改用 SHA-2 进行加密
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.32.15.163
1F:→ littleshan:po完才发现楼上比较完整,可是我又不能自删!囧 01/11 14:43
2F:推 chmod:狂推 楼上和这层楼都应该要加才对 01/11 14:45
3F:推 nowar100:都不错阿 但是不跟语言扯上点边 这样我很难做人耶 :| 01/11 14:52
4F:推 chmod:转到资安版好了 01/11 14:55
※ chmod:转录至看板 NetSecurity 01/11 14:57
5F:→ final01:多少要扯一点程式码吧 XD 01/11 16:34
6F:推 christianSK:老实说我觉得这几篇文都很棒耶XD 01/11 18:48
7F:推 linhomeyeu:如果所谓的破解是直接反函数的话确实无法吧 01/12 12:52
8F:→ linhomeyeu:现在所谓的破解都只是暴力法不是吗:) 01/12 12:52
9F:→ a1234957:应该不是破解此密码,研究怎麽绕过比较快 01/12 13:43
10F:→ a1234957:密码也只是锁而已 01/12 13:43
11F:→ a1234957:不健全的架构 用什麽超级加密演算法也没用 01/12 13:43
12F:→ a1234957:不过是资料加密就另当别论 像那个wikileaks的AES256 XD 01/12 13:44
13F:推 ledia:所谓的破解应该是指破解它的 one-way hash 的性质吧 01/12 15:54
14F:→ ledia:不一定需要反函数就做得到 01/12 15:54
15F:→ ledia:比如说有个很烂的 hash function, 很容易就能找到 input bit 01/12 15:55
16F:→ ledia:change 和 output 的改变之间的关系, 方便你伪造签章 01/12 15:56
17F:→ xatier:网路上很多好像都用 rainbow table在破 one-way-hash的样子 01/12 17:14