安全上

我刚刚宣布了新消息学习Spring Security课程,包括完整的材料集中在新的OAuth2堆栈在Spring Security 5:

>>看看这个课程
Java最高

使用Spring 5和Spring Boot 2开始,通过学习的春天课程:

>>看看这个课程

1.概述

在本教程中,我们将讨论密码哈希的重要性。

我们将快速查看它是什么,为什么重要的,以及在Java中执行它的安全和不安全的方法。

2.哈希是什么?

哈希是生成字符串的过程,或者哈希,来自给定的信息使用称为a的数学函数加密哈希功能

虽然目前有几种哈希函数,但为了安全起见,那些针对哈希密码的函数需要具备四个主要属性:

  1. 它应该是确定性:应由相同哈希函数处理的相同消息总是产生相同的哈希
  2. 不是可逆的:产生一个是不切实际的信息从它哈希
  3. 它有高:一个小变化信息应该产生极大的不同哈希
  4. 它拒绝碰撞:两个不同的消息不应该产生相同的哈希

具有所有这四个属性的哈希函数是密码哈希的有力候选,因为它们一起极大地增加了从哈希对密码进行反向工程的难度。

但是,但是,密码散列函数应该很慢。快速算法将有所帮助蛮力攻击其中一个黑客将尝试通过散列和比较数十亿(或数万亿)的潜在密码。

一些很好的哈希函数满足所有这些条件PBKDF2,BCrypt,SCrypt。但首先,让我们看看一些旧的算法,以及为什么它们不再被推荐

3.不推荐:MD5

我们的第一个哈希函数是MD5消息摘要算法,早在1992年就开发出来了。

Java的信息摘要使其易于计算,并在其他情况下仍然有用。

然而,在过去的几年里,发现了MD5失败了第四个密码散列属性在这种情况下,它变得易于生成碰撞。要将其关闭,MD5是一种快速算法,因此免于对暴力攻击无用。

由于这些,不建议使用MD5。

4.不推荐:SHA-512

接下来,我们将看看SHA-512,这是一个安全哈希算法系列的一部分,一个家庭于1993年开始使用Sha-0。

4.1。为什么sha-512?

随着计算机的力量增加,当我们发现新的漏洞时,研究人员推出了新的SHA版本。较新版本具有逐步更长的长度,或有时研究人员发布了新版本的底层算法。

SHA-512表示第三代算法中最长的密钥。

现在有更多的安全版本的SHASHA-512是Java中最强大的

4.2。在Java中实施

现在,让我们来看看在Java中实现SHA-512哈希算法。

首先,我们必须了解的概念。简单地说,这是对每个新哈希生成的随机序列

通过引入这种随机性,我们增加了哈希,我们保护我们的数据库防止已知的哈希划分的预编译列表彩虹桌子

我们的新哈希函数大致变成:

盐< - generate-salt;<- salt + ':' + sha512(salt + password)

4.3。产生盐

加入盐,我们用SECURERANDOM.班级java.security.

SecureRandom random = new SecureRandom();Byte [] salt = new Byte [16];random.nextBytes(盐);

然后,我们将使用信息摘要class配置sha - 512哈希函数与我们的盐:

MessageGigest MD = MessageGigest.getInstance(“SHA-512”);md.update(盐);

并随着添加,我们现在可以使用消化生成散列密码的方法:

hashhedpassword = md.digest(passwordToHash.getBytes(StandardCharsets.UTF_8));

4.4。为什么不推荐?

当用盐时,SHA-512仍然是一个公平的选择但那里有更强大和更慢的选择

此外,我们将涵盖的其余选项具有重要特点:可配置实力。

5. PBKDF2,Bcrypt和Scrypt

PBKDF2、BCrypt和SCrypt是三种推荐的算法。

5.1。为什么那些推荐的人?

每一个都很慢,而且每个都有一个可配置的力量的杰出特征。

这意味着随着计算机的力量增加,我们可以通过改变输入来降低算法的速度。

5.2。在Java中实施PBKDF2

现在,盐是密码哈希的基本原理,所以我们也需要一个用于PBKDF2:

SecureRandom random = new SecureRandom();Byte [] salt = new Byte [16];random.nextBytes(盐);

接下来,我们将创建一个Pbekeyspec.和一个SecretKeyFactory我们将实例化使用pbkdf2withhmacsha1.算法:

keyspec spec = new pbekeyspec(password.tochararray(),盐,65536,128);secretkeyfactory factory = secretkeyfactory.getInstance(“pbkdf2withhmacsha1”);

第三个参数(65536.)实际上是强度参数。它表示此算法运行的迭代数量,增加产生散列所需的时间。

最后,我们可以使用我们的SecretKeyFactory要生成哈希:

byte [] hash = factory.generateSecret(规格).getEncoded();

5.3。用Java实现BCrypt和SCrypt

结果是bcrypt和scrypt支持尚未与java发货,尽管一些Java库支持它们。

其中一个库是春季安全。

6.密码散列春季安全性

尽管Java本机同时支持PBKDF2和SHA哈希算法,但它不支持BCrypt和SCrypt算法。

幸运的是,我们的春季安全船只支持所有这些推荐算法的支持passwordencoder.界面:

  • MessageDigestPasswordEncoder给出了MD5和SHA-512
  • pbkdf2passwordencoder给我们PBKDF2
  • BCryptPasswordEncoder给我们bcrypt,
  • scryptpasswordencoder.给我们诽谤

用于PBKDF2、BCrypt和SCrypt的密码编码器都支持配置所需的密码散列强度。

我们可以直接使用这些编码器,即使没有基于Spring security的应用程序。或者,如果我们用Spring Security来保护我们的站点,那么我们可以通过DSL或via来配置我们想要的密码编码器依赖注入

并且,与我们上面的例子不同,这些加密算法将在内部为我们生成盐。该算法将盐存储在输出散列内,以供以后用于验证密码。

7.结论

所以,我们深入潜入密码散列;探索概念及其用途。

我们已经看了一些历史上的哈希函数,以及一些在用Java编码之前已经实现的函数。

最后,我们看到Spring Security船用其密码加密类,实现了一个不同的哈希函数数组。

一如既往,代码是GitHub上可用。

安全底部

我刚刚宣布了新消息学习Spring Security课程,包括完整的材料集中在新的OAuth2堆栈在Spring Security 5:

>>看看这个课程
Java底部

使用Spring 5和Spring Boot 2开始,通过学习的春天课程:

>>看看这个课程
2评论
最老的
最新
内联反馈
查看所有评论
评论在本文上关闭!