使用BCrypt算法免除存储salt

用户表的密码通常使用MD5等不可逆算法加密后存储,为防止彩虹表破解更会先使用一个特定的字符串(如域名)加密,然后再使用一个随机的salt(盐值)加密。

特定字符串是程序代码中固定的,salt是每个密码单独随机,一般给用户表加一个字段单独存储,比较麻烦。

BCrypt算法将salt随机并混入最终加密后的密码,验证时也无需单独提供之前的salt,从而无需单独处理salt问题。

用法很简单:

//hashed就是明文密码password加密后的结果,存储到数据库
String hashed = BCrypt.hashpw(password, BCrypt.gensalt());

//candidate是明文密码,checkpw方法返回的是boolean
if (BCrypt.checkpw(candidate, hashed))
    System.out.println("It matches");
else
    System.out.println("It does not match");

BCrypt下载:http://www.mindrot.org/projects/jBCrypt/

时间: 2024-08-03 18:45:56

使用BCrypt算法免除存储salt的相关文章

Spring Security笔记:使用BCrypt算法加密存储登录密码

在前一节使用数据库进行用户认证(form login using database)里,我们学习了如何把“登录帐号.密码”存储在db中,但是密码都是明文存储的,显然不太讲究.这一节将学习如何使用spring security3新加入的bcrypt算法,将登录加密存储到db中,并正常通过验证. 一.Bcrypt算法 int t = 0; String password = "123456"; System.out.println(password + " -> "

saltstack (4) 用mysql存储 salt 返回值

Salt返回接收器(returner)允许把minion的响应保存在各种数据存储或不同的位置,甚至把响应内容显示在命令行.Returner可以用来扩展Salt,和新的.定制的接口和支持新的数据库进行通信.本例用mysql存储salt返回值 操作如下: [[email protected] ~]# yum -y install mysql-connector-python [[email protected] ~]# yum -y install MySQL-python27 [[email pr

密码安全存储——PBKDF2、bcrypt、scrypt

密码用单向哈希存储保证了数据库被脱后用户密码的安全. 由于彩虹表这种攻击方式的存在,一般认为md5,SHA1等单向算法的安全性是不够的.那如何选择合适的加密算法? 下面介绍业界几种高强度单向哈希算法,并比较其优劣. PBKDF2 PBKDF2 是一个比较简单的算法,它根据'iterations'参数大小,执行N次HMAC运算. HW数据库密码存储的最低安全要求是,1000次HMAC-SHA256计算,推荐的是1万次.当然满足最低要求前提下,到底多少次合适需综合考虑性能要求. 使用GPU阵列.或F

Lucene4.2源码解析之fdt和fdx文件的读写——fdx文件存储一个个的Block,每个Block管理着一批Chunk,通过docID读取到document需要完成Segment、Block、Chunk、document四级查询,引入了LZ4算法对fdt的chunk docs进行了实时压缩/解压

前言 通常在搜索打分完毕后,IndexSearcher会返回一个docID序列,但是仅仅有docID我们是无法看到存储在索引中的document,这时候就需要通过docID来得到完整Document信息,这个过程就需要对fdx/fdt文件进行读操作.为了更清楚地了解fdx/fdt文件的作用,本文把fdx/fdt文件的读和写整合到了一起,尽管这在Lucene中是两个分开的过程. 1. 索引生成阶段 索引生成阶段包含着一个复杂的过程,所以了解本文前最好对Lucene的索引架构有一定的了解,可以参考博

用户密码加密存储十问十答,一文说透密码安全存储

我们数据库的权限管理十分严格,敏感信息开发工程师都看不到,密码明文存储不行吗? 不行.存储在数据库的数据面临很多威胁,有应用程序层面.数据库层面的.操作系统层面的.机房层面的.员工层面的,想做到百分百不被黑客窃取,非常困难. 如果密码是加密之后再存储,那么即便被拖库,黑客也难以获取用户的明文密码.可以说,密码加密存储是用户账户系统的底裤,它的重要性,相当于你独自出远门时缝在内衣里钱,虽然你用到他们的概率不大,但关键时刻他们能救命. 那用加密算法比如AES,把密码加密下再存,需要明文的时候我再解密

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

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

浅谈密码存储安全

前言 用户信息泄露事件层出不穷,百度或谷歌输入"密码泄露",搜出来的泄密门更是让人目瞪口呆:从小公司到大公司,从明文存储到普通的哈希加密.作为一个IT从业者,我深刻感受到"得用户者得天下",尤其在互联网+盛行的趋势下.密码存储作为软件服务系统基础架构中不可缺少的一部分,越来越多的受到开发者的重视.对于一个服务,如果信息安全部分出问题,我想没有必要进一步去做用户体验的提升,性能的优化.进而也不可能获取大用户的青睐.还是那句话:出来混,迟早要还的. 本人并非密码学出生,

巧妙地用二叉树完成算式计算算法<计算器,二叉树,C++,独辟蹊径>

#01.引言,我们知道算式计算的问题是栈里面一个非常经典的题目.但是用栈来实现是一个非常麻烦的过程,第一要解决算式判断,是否为符合规则的算式,第二要由中最表达式转化为后缀表达式.这两个部分是栈实现计算算式表达式的比较复杂的地方.不仅如此,栈实现里面的各种运算符的优先级,各种条件判断,可以说是麻烦的要命.但是,实际上有一种数据结构比栈更适合解决这类问题.可以说是得天独厚的优势.对,就是二叉树.例如一个表达式:1+2*3-4/5 我们构造这样一个二叉树 当构造这样一个二叉树之后,解决表达式的值的方法

bcrypt 加密的坑

const bcrypt = require('bcryptjs') //加密 //不存在,则存储 const newUser = new User({ name: ctx.request.body.name, email: ctx.request.body.email, password:  ctx.request.body.password }); //加密 await bcrypt.genSalt(10, (err, salt) => { bcrypt.hash(newUser.passw