API安全(六)-密码加密

摘要:
因此,用户的密码必须加密。这种将字符串添加到散列中的方法称为“添加盐”。因此,密码加密的最佳算法是不可逆的,并且使用随机盐。密码加密常用的算法是bcrypt和scrypt。

1、密码为什么要加密

存在数据库中的密码如果是明文,一旦数据库数据泄漏了,别人就可以拿着你的账号密码为所欲为。更何况有很多人在各个平台的用户名密码都是一致的。所以用户的密码,一定要加密存储。

2、加密算法的种类

2.1、对称加密,指的是需要对加密和解密使用相同密钥的加密算法。常见的对称加密算法有:DES、3DES、AES等。

2.2、非对称加密,它需要两个密钥,一个称为公钥(public key),一个称为私钥(private key)。加密和解密使用两个不同的密钥。例如:甲生成一对密钥,并将其中的一把作为公钥向其他人公开,得到该公钥的乙使用该密钥对信息进行加密后在发送给甲,甲使用自己保存的另一把私钥,对加密后的信息进行解密。常见的非对称加密算法有RSA、DSA等。

2.3、单向hash算法,就是把任意长的消息串转化为固定长度的输出串的一种算法。一般用户信息摘要。常见的有MD5、SHA、MAC等。

2.4、加盐hash算法,盐(Salt),在密码学中,是指在散列之前将散列内容(例如:密码)的任意固定位置插入特定的字符串。这个在散列中加入字符串的方式称为“加盐”。其作用是让加盐后的散列结果和没有加盐的结果不相同,在不同的应用情景中,这个处理可以增加额外的安全性。

3、密码加密的算法选择

3.1、可逆的算法不要选,会增加密码泄漏的风险。

3.2、MD5不要选,MD5并不是一个加密算法,而是一个信息摘要算法,可通过彩虹表进行破解,且相同明文加密后的密文是一致的,一旦破解出来一个,其余相同的也都知道了。

3.3、不要加固定的盐,比如说用户名,邮箱等,如果数据库被攻破了,盐会被拿到。一旦盐泄漏,根据盐重新建立彩虹表可以进行破解。

所以用于密码加密的算法最好是,不可逆的,且使用随机盐,常用做密码加密的算法有bcrypt、scrypt。

4、使用bcrypt对密码进行加密(推荐使用)

4.1、导入依赖

<dependency>
    <groupId>org.mindrot</groupId>
    <artifactId>jbcrypt</artifactId>
    <version>0.4</version>
</dependency>

4.2、对密码进行加密

@Override
    @Transactional(rollbackFor = Exception.class)
    publicUserDTO create(UserDTO userDTO) {
        /** 将密码加密成密文
         */userDTO.setPassword(BCrypt.hashpw(userDTO.getPassword(),BCrypt.gensalt()));
        UserDO userDO = newUserDO();
        BeanUtils.copyProperties(userDTO, userDO);
        userRepository.save(userDO);
        userDTO.setId(userDO.getId());
        returnuserDTO;
    }

4.3、认证过滤器,修改密码校验方式

API安全(六)-密码加密第1张

4.4、创建两个用户,并使用相同的密码123456,查看数据库中存储的密码是不一致的

API安全(六)-密码加密第2张

4.5、测试认证功能

API安全(六)-密码加密第3张

这样,我们数据库中的密码就安全多了。

5、使用scrypt对密码进行加密

5.1、导入依赖

<dependency>
    <groupId>com.lambdaworks</groupId>
    <artifactId>scrypt</artifactId>
    <version>1.4.0</version>
</dependency>

5.2、对密码进行加密

userDTO.setPassword(SCryptUtil.scrypt(userDTO.getPassword(),2 << 14,8,1));

5.3、认证过滤器,修改密码校验方式

API安全(六)-密码加密第4张

效果与使用bcrypt类似,该算法唯一的缺点就是慢。

源码地址:https://github.com/caofanqi/study-security/tree/dev-encryption

免责声明:文章转载自《API安全(六)-密码加密》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇JS高级---把局部变量变成全局变量C#-WebForm-JS知识:基础部分、BOM部分、DOM部分、JS事件下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

SpringBoot使用MyBatis-Generator详解-copy

SpringBoot使用MyBatis-Generator详解MyBatis-Generator简介MyBatis-Generator使用添加maven依赖创建MBG配置文件运行MBG,生成底层类数据库查询 前几天工作中接触到MyBatis-Generator,发现其方便之处,MyBatis-Generator可以帮助我们实现数据库繁复的增删改查操作,当数...

解除SQL SERVER 数据库被单个用户独占的问题

注意将dbname改为单个用户的数据库名--第一步 DECLARE @SQL VARCHAR(MAX); SET @SQL='' SELECT @SQL=@SQL+'; KILL '+RTRIM(SPID) FROM master..sysprocesses WHERE dbid=DB_ID('dbname'); EXEC(@SQL); --第...

KBEngine源码:组件方案

相对于skynet,KBEngine提供了完整的组件方案。 Loginapp 登录验证、注册、Client的接入口。 Baseapp 通过Loginapp分配过来的Client会与Baseapp保持连接,完成客户端与服务端的交互。 定时把Entity的数据保存进数据库。 Baseapp之间会进行互相备份,保证数据的安全。 灾难恢复-当Baseapp发生问...

Java高并发,如何解决,什么方式解决

  对于我们开发的网站,如果网站的访问量非常大的话,那么我们就需要考虑相关的并发访问问题了。而并发问题是绝大部分的程序员头疼的问题,但话又说回来了,既然逃避不掉, 那我们就坦然面对吧~今天就让我们一起来研究一下常见的并发和同步吧。   为了更好的理解并发和同步,我们需要先明白两个重要的概念:同步和异步    1、同步和异步的区别和联系    所谓同步,可以...

asp.net core系列 30 EF管理数据库架构--必备知识 迁移

一.管理数据库架构概述          EF Core 提供两种主要方法来保持 EF Core 模型和数据库架构同步。一是以 EF Core 模型为基准,二是以数据库为基准。            (1)如果希望以 EF Core 模型为准,请使用迁移。 对 EF Core 模型进行更改时,此方法会以增量方式将相应架构更改应用到数据库,以使数据库保持与...

SQL必知必会

数据库基础——数据库术语数据库:数据库是一个以某种有组织的方式存储的数据集合。数据库(database)保存有组织的数据的容器(通常是一个文件或一组文件)。数据库软件应称为数据库管理系统(DBMS)。数据库是通过 DBMS 创建和操纵的容器。表(table)某种特定类型数据的结构化清单。模式(schema)关于数据库和表的布局及特性的信息。表由列组成。列存...