如何安全的存储密码?

Clicks: 898 Date: 2014-09-24 15:47:48 Power By 李轩Lane

Tag哈希hash加密

一、我是新手我怕谁

    新手程序猿通常会直接存储明文密码在数据库中,好一点的会使用MD5来加密密码后存储md5(password),再好一点的会sha1加密密码后存储sha1(password)。将常用的组合哈希后存入数据库,用来爆库,这个就是所谓的彩虹表。

二、加盐salted

    在密码中加入随机数字或字符,然后再进行哈希,看起来叼了很多,但是实际上对于现在计算机来说,即使简单的使用了盐和哈希的加密,短密码仍然会在非常短的情况下就会被破解出来。

三、美国标准

    美国政府的标准,已经用于政府和军方的系统。PBKDF2加密算法,全程是Password-Based Key Derivation Function。

    PBKDF2加密算法就是牺牲了时间来换取安全,一个明文的密码+随机的盐,然后哈希散列加密后存储起来,这是我们前面说的(二、加盐salted)。把这个过程重复100次,得到的结果存储起来。

    请注意,尽管我们说牺牲了时间,又说到了重复100次,那也是很快的,因为我们的普通服务器单次的运算都是在毫秒级。

四、scrypt

    scrypt是由著名的FreeBSD黑客 Colin Percival为他的备份服务 Tarsnap开发的。scrypt不仅计算所需时间长,而且占用的内存也多,使得并行计算多个摘要异常困难,因此利用彩虹表进行暴力攻击更加困难。scrypt没有在生产环境中大规模应用,并且缺乏仔细的审察和广泛的函数库支持。但是,scrypt在算法层面只要没有破绽,它的安全性应该高于PBKDF2。

五、请使用bcrypt!请使用bcrypt!请使用bcrypt!

    bcrypt是跨平台的、专门为密码存储而设计的算法,bcrypt所接受的密码长度必须是8至56个字符,并将在内部被转化为448位的密钥。基于Blowfish加密算法变形而来。

    bcrypt在默认情况下,在删除数据之前将使用随机数据三次覆盖原始输入文件,以阻挠可能会获得数据的人恢复数据的尝试。如果您不想使用此功能,可设定禁用此功能

   bcrypt最大的好处是有一个参数,可用于调整计算强度,而且该参数是包括在输出的摘要中的。随着计算能力的提高,应该可以逐步增大这个参数,增大这个参数后并不会影响原来的用户。

   bcrypt经过了很多安全专家的仔细分析,使用在以安全著称的OpenBSD中,一般认为它比PBKDF2更能承受随着计算能力加强而带来的风险。
时间: 2024-08-27 11:28:20

如何安全的存储密码?的相关文章

为什么存储密码字符数组比字符串更合适?

个人觉得此话很有道理:任何与字符串相关的问题一定可以从字符串的属性里面的线索中找到. 1.因为字符串是不可变对象,如果作为普通文本存储密码,那么它会一直存在内存中直至被垃圾收集器回收.因为字符串从字符串池中取出的(如果池中有该字符串就直接从池中获取,否则new 一个出来,然后把它放入池中),这样有很大的机会长期保留在内存中,这样会引发安全问题.因为任何可以访问内存的人能以明码的方式把密码dump出来.另外你还应该始终以加密而不是普通的文本来表示密码.因为字符串是不可变,因此没有任何方法可以改变其

Java存储密码用字符数组

字符数组和字符串都可以用于存储文本数据,但是在选择具体哪一种时,如果你没有针对具体的情况是很难回答这个问题的.但是任何与字符串相关的问题一定有线索可以在字符串的属性里面找到,比如不可变性.他就用这种方式去说服面试官.这里我们就来探讨一些关于为什么你应该使用char[] 来存储密码而不是字符串. 因为字符串是不可变对象,如果作为普通文本存储密码,那么它会一直存在内存中直至被垃圾收集器回收.因为字符串从字符串池中取出的(如果池中有该字符串就直接从池中获取,否则new 一个出来,然后把它放入池中),这

Android KeyStore 存储密码

以前KeyStore的概念就是存储app签名的地方,如果你查Android KeyStore,出来的资料都是如何给app生成签名什么的,但是这里的意义却不相同.Android KeyStore系统允许你存储加密密钥,并且难以从设备中导出,并且可以指明key的使用规则,例如只有用户验证后,才可以使用key等. 防止导出的方法: Key material never enters the application process. Key material may be bound to the se

键值对存储、撤销存储密码

道理很简单 , 当确定保存的时候,SP名字设置为 remember + 帐号, 对应的值设置为密码 .取消保存的时候设置为空就好 if (rememberPassword) { configSE.putString(AppConstant.SP_REMEMBERPASSWORD + phoneNum, password); }else{ configSE.putString(AppConstant.SP_REMEMBERPASSWORD + phoneNum, ""); } 那如何在输

PHP 存储密码

最佳实践是 $hashedPassword = password_hash('my super cool password', PASSWORD_DEFAULT); $res = password_verify('the wrong password', $hashedPassword); var_dump($res); // false $res = password_verify('my super cool password', $hashedPassword); var_dump($re

浏览器存储的密码是一个潜在的威胁

特将自己遇到的情况 跟大家分析下,避免大家中招! 情形是这样的:之前本人丢了一台iphone,已经收到过两次钓鱼连接,比较谨慎,用了mac 本去登陆的,相安无事! 最后一次又收到了钓鱼连接,手欠的用之前登陆过icloud账号的windows pc 去登陆的.然后中招了!密码泄露! 分析: 我的浏览器是google chrome,设置了保存密码. 点击钓鱼链接时,链接盗取了chrome 存储密码的文件. chrome 将保存的密码存储到 C:\Users\lenovo\AppData\Local\

如何安全的存储用户密码?

原文链接:请猛击 本文我只截取了一小部分知识,请看原文. 一:基础知识:加盐哈希( Hashing with Salt) 我们已经知道,恶意攻击者使用查询表和彩虹表,破解普通哈希加密有多么快.我们也已经 了解到,使用随机加盐哈希可以解决这个问题.但是,我们使用什么样的盐值,又如何将其 混入密码中? 盐值应该使用加密的安全伪随机数生成器( Cryptographically Secure Pseudo-Random Number Generator,CSPRNG )产生.CSPRNG和普通的伪随机

密码存储相关总结

1. 一般数据库中存储密码使用MD5或者SHA系列(如SHA1.SHA256.SHA384.SHA512等) 1) 这两种算法都是单向的Hash(不可逆),MD5为128位,SHA1为160位(位数长,所以SHA1穷举破解比MD5难).从理论上来说,有可能不同的数据生成同样的MD5值. 2) 均有彩虹表可破. 3) 加盐可以应付彩虹表.加盐后,密码长度数倍增长,相应彩虹表会扩大无数倍,这样的彩虹表是很难存储的,无法通过以空间换时间的方式去破解.但如果是固定盐,并且盐丢了,只需要重新计算一份彩虹表

密码存储中MD5的安全问题与替代方案

md5安全吗?有多么地不安全?如何才能安全地存储密码?... md5安全吗? 经过各种安全事件后,很多系统在存放密码的时候不会直接存放明文密码了,大都改成了存放了 md5 加密(hash)后的密码,可是这样真的安全吗? 这儿有个脚本来测试下MD5的速度, 测试结果: [[email protected] tools]# php speed-of-md5.php Array ( [rounds] => 100 [times of a round] => 1000000 [avg] => 0