zoukankan      html  css  js  c++  java
  • 加密

    加密

    一.对称加密

    特点:
    	加密和解密使用同一个秘钥
    存在的问题
    	加密解密用同一个密钥,被黑客拦截知道密钥后安全丧失
    

    二.非对称加密

    特点:
    	加密和解密使用不同的秘钥,一把作为公开的公钥,另一把作为私钥。公钥加密的信息,只有私钥才能解密。私钥加密的信息,只有公钥才能解密
    	公钥可以公开给别人进行加密,私钥永远在自己手里,非常安全,黑客拦截也没用,因为私钥未公开
    	
    存在的问题:
    	相比于对称加密,速度会比较慢一些
    

    2.1 简单原理

    公钥加密的数据无法使用公钥反推出来,例如

    A告诉B,公钥是3233,17

    假设B要传的数据是44

    那么根据公式计算

    B就把678这个数字传给A

    上面说了,反着推是推不出来的

    那A怎么解密呢?A自己还有一个密匙2753,用自己的密匙算一下就知道了

    那为什么公钥加密的信息可以通过私钥解密?为什么公钥加密很难反推出来?这个我就不知道了,我对这方面也没什么兴趣,感兴趣的可以找一些大学公开课看看

    2.2实际应用

    此时还有一个问题,那就是

    假如A与B进行通信,A持有私钥,B持有公钥

    存在一个黑客C,可以截获到AB之间发送的任何信息

    那么C就可以知道B所持有的公钥,从而知道A发送给B的任何信息

    也就是B->A的信息他无法破解

    ​ 但A->B的信息他都能知道

    这样一来加密似乎没什么意义

    那么在实际的生产生活中解决方法是,使用非对称传递对称加密密钥,然后使用对称加密传递消息

    (1) A需要在银行的网站做一笔交易,他的浏览器首先生成了一个对称密钥
    
    (2) A的浏览器向银行的服务器请求非对称加密公钥
    
    (3) 银行系统自动生成一对非对称密钥,然后将其中的公钥发送给A
    
    (4) A的浏览器使用银行发来的公钥将自己之前生成的对称密钥加密
    
    (5) A的浏览器将加密后的对称密钥发送给银行
    
    (6) 银行使用私钥解密得到A发来的对称密钥
    
    (7) 之后,A与银行使用对称密钥进行通信
    

    三.hash散列

    根据key值和hash函数计算得到一个计算结果,我们希望能够达到的结果是

    严格来说不算是加密

    Hash算法特别的地方在于它是一种单向算法,用户可以通过Hash算法对目标信息生成特定长度且唯一的Hash值,但不能通过这个Hash值重新获得目标信息。因此Hash算法常用在不可还原的密码存储、信息完整性校验等

    MD5

    简介

    MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。
    

    特点

    1、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
    2、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。(不可逆)
    3、压缩性:任意长度的数据,算出的MD5值长度都是固定的128bit
    4、容易计算:从原数据计算出MD5值很容易。
    

    bcrypt

    依赖

    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-config</artifactId>
    </dependency>
    

    代码

    public class BcryptTest {
        public static void main(String[] args) {
            //用户密码
            String password = "123456";
            //密码加密
            BCryptPasswordEncoder passwordEncoder=new BCryptPasswordEncoder();
            //加密
            String newPassword = passwordEncoder.encode(password);
            System.out.println("加密密码为:"+newPassword);
            //对比这两个密码是否是同一个密码
            boolean matches = passwordEncoder.matches(password, newPassword);
            System.out.println("两个密码一致:"+matches);
        }
    }
    
  • 相关阅读:
    Java学习--list,set,Map接口使用
    Java学习--java中的集合框架、Collection接口、list接口
    Java学习--使用 Math 类操作数据
    Java学习--Calendar 类的应用
    Java学习--使用 Date 和 SimpleDateFormat 类表示时间
    Java学习--Java 中基本类型和字符串之间的转换
    Java学习网址
    Java开发学习--Java 中基本类型和包装类之间的转换
    Java学习--Java 中的包装类
    builtroot make menuconfig流程
  • 原文地址:https://www.cnblogs.com/INnoVationv2/p/15111689.html
Copyright © 2011-2022 走看看