关于密码加密

用户的密码必须经过算法进行编码(encode),然后将编码结果存储到数据库中,后续,当需要验证密码时,也使用同样的编码过程对用户后续提交的密码再次进行编码,并与此前存入到数据库的密码进行对比,以此判断用户的密码是否正确。

编码:可作为动词,将原始数据通过某种算法,运算得到另一个数据,即可称之为“编码”。

 用户使用的原始密码通常称之为“原文”,或“明文”,经过编码后的结果称之为“密文”。

 目前,主流的用于解决各种应用场景的算法都不需要单独设计,有许多成熟的算法可以直接使用,并且,这些算法都有非常简单的API。

 对密码的原文进行编码时,不可以使用加密算法!这类算法都是可以逆向运算的,主要用于保障数据传输过程的安全,并不能保障存储下来的密码的安全!

推荐使用消息摘要算法或其它哈希算法,用于对密码的原文进行编码,这些算法都是不可逆向运算的,即使算法类型、运算参数、密文全部被泄露,也不可能被计算得到密码的原文。  

常见的消息摘要算法有:  

MD(Message Digest)系列:  

 MD2(128位算法)

MD4(128位算法)

MD5(128位算法)

 SHA(Secure Hash Algorithm)家族:

 SHA(SHA-1,160位算法)

SHA-256(256位算法)

SHA-384(384位算法)

SHA-512(512位算法)

 消息摘要算法的主要特征有:

使用同一种算法时,如果消息相同,摘要一定相同 使用同一种算法时,无论消息多长,摘要长度是固定的 使用同一种算法时,如果摘要不同,消息极大概率不会相同 必然存在n种不同的消息,对应的摘要是完全相同的 以MD5算法为例,是128位算法,其运算结果有340282366920938463463374607431768211456种。  

 当然,如果算法类型、运算参数、密文全部被泄露,破解者仍可以通过穷举式的暴力破解来“试”出密码的原文!

 为了进一步保障密码安全,应该要求用户使用安全强度更高的密码!

 可通过键盘输入的大写字母、小写字母、数字、符号统称为“可打印字符”,共95种,如果用户使用6位长度的密码,如果用户使用6位长度的密码,将有约7350亿种不同的排列组合,则破解者最多需要运算7350亿次才可以保证100%的“试”出用户的原始密码,如果用户使用8位长度的密码,将有约6634万亿种不同的排列组合,所以,使用安全强度更高的密码,可以明显提高穷举式的暴力破解的难度!

 参考数据:普通的家用电脑每秒可以执行300万至1000万次MD5运算,换算为每小时约可执行1000亿至3000亿次MD5运算!

 另外,在网络上,有一些平台使用数据库记录了一些明文与密文的对应关系,对于通过常见算法进行编码的密文,能够实现“反查式”的“破解”,但是,这些平台能够收录的数据量是非常有限的,如果某个平台需要记录所有8位长度的明文与密文的对应关系,在不使用预计算的哈希链的情况下,需要记录6634万亿条数据,几乎是不可能的!

 为了进一步保证密码安全,可以采用加“盐”的方式!所谓的“盐”,本质上就是一个难以预测的字符串,它会被应用于处理密码加密的过程中,例如:

String salt = "fhjsDSIKmdjn3UAFsa8TRiu7Efdr3425";
String rawPassword = "123456";
String encodedPassword = DigestUtils.md5DigestAsHex(
        (rawPassword + salt).getBytes());
System.out.println("原文:" + rawPassword);
System.out.println("密文:" + encodedPassword);

在以上过程中,“盐”的核心价值就是“使得被运算数据变得更加复杂”!所以,使用什么样的盐、如何使用盐并没有明确的规定或必须遵守的做法!

 在有些做法中,甚至会使用随机的数据作为“盐”,使用这种做法后,即便多个完全相同的原始密码,对应的密文都是不同的!但是,使用这种做法时,必须记录下随机的盐值,否则,后续将无法验证密码!至于如何将盐值记录下来,可以选择在数据表中增加字段进行记录,甚至,可以选择将盐值作为密文的一部分!

 所以,通常有效的保障密码安全的加密手段有:

要求用户使用安全强度更高的原始密码 使用盐,甚至随机盐 使用位数更长的算法 多重加密 综合使用以上做法 需要注意,即便使用以上所有措施,依然无法解决内部泄密进而使用穷举式的暴力破解的问题!普通的家用电脑每秒可以进行约300万次MD5运算!  

使用BCrypt算法可以非常有效的避免暴力破解!  

BCrypt算法本身是自带随机盐值的,所以,使用相同的原文,多次进行编码,得到的结果均不会相同!但这并不影响它验证原文与密文是否匹配!  

BCrypt算法被设计为运算效率极低的算法,普通的家用电脑每秒仅能执行12次左右BCrypt运算!由于极低的运算效率,给暴力破解带来了非常大的难度!  

在创建BCryptPasswordEncoder对象时,可以通过构造方法的参数传入“强度值”,如果使用的无参构造方法,则强度为10,表示其内部会执行2的10次方哈希运算,例如修改为12,就表示将执行2的12次方法哈希运算,则运算过程耗时更长!耗时更长,则执行效率更低,但是,可以更加有效的避免暴力破解!

希望本文对你有所帮助! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值