一文说清:可逆与不可逆加密算法,对称与非对称加密算法-据说BCrypt比MD5要好?

·  阅读 1200
一文说清:可逆与不可逆加密算法,对称与非对称加密算法-据说BCrypt比MD5要好?

BCrypt、MD5、AES、HS256等加密算法及其用途-加密算法精要

据说BCrypt比MD5要好?什么可逆加密算法,对称加密算法,非对称加密算法、不可逆加密算法!想要掌握吗?看这篇就够了!

导引

开发的过程中,大型系统架构中,多会涉及使用加密算法。很多同学只是会用一些诸如Base64,MD5,数字签名或BCrypt做加密。但是对于为什么要加密,加密方式的特点却不甚清楚。而为什么使用,恰恰比怎么用更加重要!!

还是那句话:一定是有需求,才催生技术!

技术的使用【代码】是简单的,难的如何使用【变现】。

收入+需求+deadline才是攻城狮的第一生产力

基于小伙伴这样的困惑,雄哥在这里做下扫盲,简单梳理下加密算法,重点指出需求场景!带大家一篇文章,拿下加密算法

一、什么是加密算法

加密算法说白了就是一种对数据上锁的function!

数据加密的基本过程:

  1. 对原来为明文的文件或数据按某种算法进行处理
  2. 加密后的数据不可读,是“密文”
  3. 只能在输入相应的密钥之后才能显示出原容

**目标:**通过加密算法的途径来达到,保护数据不被非法人窃取、阅读的目的!

该过程的逆过程为解密

二、加密算法的种类

  • 可逆加密算法,特点:加密了,还能解密的算法
    • 对称加密
    • 非对称加密
  • 不可逆加密算法,特点:加密了,永远不能解密的算法。直到宇宙的尽头也不行
  • Base64编码:很多同学觉得base64不是加密算法,但严格来说还真算加密算法!

三、可逆加密算法

解释: 加密后, 密文可以反向解密得到密码原文.

3.1 对称加密

文件加密和解密使用相同的密钥,即加密密钥也可以用作解密密钥

解释: 在对称加密算法中,数据发信方将明文和加密密钥一起经过特殊的加密算法处理后,使其变成复杂的加密密文发送出去,收信方收到密文后,若想解读出原文,则需要使用加密时用的密钥以及相同加密算法的逆算法对密文进行解密,才能使其回复成可读明文。在对称加密算法中,使用的密钥只有一个,收发双方都使用这个密钥,这就需要解密方事先知道加密密钥。

优点: 对称加密算法的优点是算法公开、计算量小、加密速度快、加密效率高。

缺点: 没有非对称加密安全.

用途: 一般用于保存用户手机号、身份证等敏感但能解密的信息。

常见的对称加密算法有: AES、DES、3DES、Blowfish、IDEA、RC4、RC5、RC6、HS256

3.2 非对称加密

两个密钥:公开密钥(publickey)和私有密钥,公有密钥加密,私有密钥解密

**解释: ** 同时生成两把密钥:私钥和公钥,私钥隐秘保存,公钥可以下发给信任客户端.

加密与解密:

  • ​ 私钥加密,持有私钥或公钥才可以解密

  • ​ 公钥加密,持有私钥才可解密

签名:

  • ​ 私钥签名, 持有公钥进行验证是否被篡改过.

**优点: ** 非对称加密与对称加密相比,其安全性更好;

缺点: 非对称加密的缺点是加密和解密花费时间长、速度慢,只适合对少量数据进行加密。 用途: 一般用于签名和认证。私钥服务器保存, 用来加密, 公钥客户拿着用于对于令牌或者签名的解密或者校验使用.

常见的非对称加密算法有: RSA、DSA(数字签名用)、ECC(移动设备用)、RS256 (采用SHA-256 的 RSA 签名)

四、不可逆加密算法

解释: 一旦加密就不能反向解密得到密码原文.

种类: Hash加密算法, 散列算法, 摘要算法等

**用途:**一般用于效验下载文件正确性,一般在网站上下载文件都能见到;存储用户敏感信息,如密码、 卡号等不可解密的信息。

常见的不可逆加密算法有: MD5、SHA、HMAC

五、Base64编码

Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一。Base64编码可用于在HTTP环境下传递较长的标识信息。采用Base64Base64编码解码具有不可读性,即所编码的数据不会被人用肉眼所直接看到。注意:Base64只是一种编码方式,不算加密方法。

在线编码工具:www.jsons.cn/img2base64/

六、BCrypt迅速掌握

在系统架构中,对于用户密码的保护,通常都会进行加密。我们通常对密码进行加密,然后存放在数据库中,在用户进行登录的时候,将其输入的密码进行加密然后与数据库中存放的密文进行比较,以验证用户密码是否正确。 目前,MD5和BCrypt比较流行。相对来说,BCrypt比MD5更安全。

BCrypt 官网www.mindrot.org/projects/jB…

(1)我们从官网下载源码

(2)新建工程,将源码类BCrypt拷贝到工程

(3)新建测试类,main方法中编写代码,实现对密码的加密

String gensalt = BCrypt.gensalt();//这个是盐  29个字符,随机生成
System.out.println(gensalt);
String password = BCrypt.hashpw("雄哥666", gensalt);  //根据盐对密码进行加密
System.out.println(password);//加密后的字符串前29位就是盐
复制代码

(4)新建测试类,main方法中编写代码,实现对密码的校验。BCrypt不支持反运算,只支持密码校验。

boolean checkpw = BCrypt.checkpw("雄哥666",     "$2a$10$61ogZY7EXsMDWeVGQpDq3OBF1.phaUu7.xrwLyWFTOu8woE08zMIW");
System.out.println(checkpw);
复制代码

七、如何在自己的项目中使用BCrypt

7.1 新增用户账户密码加密

新增用户账户信息,使用BCrypt进行密码加密

代码实现

(1)将BCrypt源码拷贝到自己的工程utils包下

(2)修改项目的UserServiceImpl

/**
     * 增加
     * @param User
     */
@Override
public void add(User user){
    String password = BCrypt.hashpw(User.getPassword(), BCrypt.gensalt());
    user.setPassword(password);   
    userMapper.insert(user);
}
复制代码

7.2 用户登录的密码验证

需求分析

系统用户需要登陆后台系统,需要先输入用户名和密码进行登录,才能进入后台系统。

思路:

  1. 用户发送请求,输入用户名和密码
  2. 后台系统微服务controller接收参数,验证用户名和密码是否正确,如果正确则返回用户登录成功结果

代码实现

(1)UserService新增方法定义

    /**
     * 登录验证密码
     * @param User
     * @return
     */
    boolean login(User user);
复制代码

(2)UserServiceImpl实现此方法

    @Override
    public boolean login(User user) {
        //根据登录名查询管理员
        User u1=new User();
        u1.setLoginName(User.getLoginName());
        u1.setStatus("1");
        User u2 = UserMapper.selectOne(u1);//数据库查询出的对象
        if(u2==null){
            return false;
        }else{
            //验证密码, Bcrypt为spring的包, 第一个参数为明文密码, 第二个参数为密文密码
            return BCrypt.checkpw(u1.getPassword(),u2.getPassword());
        }
    }
复制代码

(3)UserController新增方法

    /**
     * 登录
     * @param User
     * @return
     */
    @PostMapping("/login")
    public Result login(@RequestBody User user){
        boolean login = UserService.login(user);
        if(login){
            return new Result();
        }else{
            return new Result(false,StatusCode.LOGINERROR,"用户名或密码错误");
        }
    }
复制代码

总结

本文章掘金首发,未经许可请勿擅自转发至其他平台!请尊重原创,谢谢

分类:
后端
标签:
分类:
后端
标签: