SSL/TLS协议核心原理解析与实战

news2024/10/6 18:24:48

什么是SSL/TLS

SSL(secure sockets layer,安全套接层)安全传输技术。TCP是传输层的协议,但是它是明文传输的,是不安全的。SSL的诞生给TCP加了一层保险,为TCP通信提供安全及数据完整性保护。TLS只是SSL的升级版,它们的作用是一样的。TLS(TransportLayer Security,传输层安全协议)由两层组成:TLS记录(TLS Record)和TLS握手(TLSHandshake)。TLS协议是更新、更安全的SSL协议版本。

SSL/TLS协议的分层结构

SSL/TLS协议包括握手协议(Handshake Protocol)、密码变化协议(SSL Change Cipher SpecProtocol)、警告协议(Alert Protocol)、记录协议(Record Protocol)。
(1)握手协议:SSL/TLS协议非常重要的组成部分,用来协商通信过程中使用的加密套件(加密算法、密钥交换算法和MAC算法等)、在服务端和客户端之间安全地交换密钥、实现服务端和客户端的身份验证。
(2)密码变化协议:客户端和服务端通过密码变化协议通知对端,随后的报文都将使用新协商的加密套件和密钥进行保护和传输。
(3)警告协议:用来向对端发送告警信息,消息中包含告警的严重级别和描述。
(4)应用数据协议:负责将SSL/TLS承载的应用数据传达给通信对端。
(5)记录协议:主要负责对上层的数据(SSL/TLS握手协议、SSL/TLS密码变化协议、SSL/TLS警告协议和应用数据协议)进行分块计算、添加MAC值、加密等处理,并把处理后的记录块传输给对端。
SSL/TLS协议的分层结构如图所示:
在这里插入图片描述
SSL/TLS协议主要分为两层(上层的是握手协议、密码变化协议、警告协议和应用数据协议,下层的是记录协议),主要负责使用对称密码对消息进行加密。其中,握手协议(Handshake Protocol)是SSL/TSL通信中最复杂的子协议,也是安全通信所涉及的第一个子协议。

加密算法原理

为了理解SSL/TLS原理,大家需要掌握一些加密算法的基础知识。当然,这不是为了让大家成为密码学专家,所以只需对基础的加密算法有一些了解即可。基础的加密算法主要有哈希(Hash,或称为散列)、对称加密(Symmetric Cryptography)、非对称加密(Asymmetric Cryptography)、数字签名(Digital Signature)。

哈希单向加密算法原理

哈希算法(或称为散列算法)比较简单,就是为待加密的任意大小的信息(如字符串)生成一个固定大小(比如通过MD5加密之后是32个字符)的字符串摘要。常用的哈希算法有MD5、SHA1、SHA-512等。哈希是不可逆的加密技术,一些数据一旦通过哈希转换为其他形式,源数据将永远无法恢复。
在哪些场景下使用哈希加密呢?一般来说,在用户注册的时候,服务端保存用户密码的时候会将明文密码的哈希密码存储在数据库中,而不是直接存储用户的明文密码。当用户下次登录时,会对用户的登入密码(明文)使用相同的哈希算法进行处理,并将哈希结果与来自数据库的哈希密码进行匹配,如果是相同的,那么用户将登录成功,否则用户将登录失败。
哈希加密也称为单向哈希加密,是通过对不同输入长度的信息进行哈希计算得到固定长度的输出,是单向、不可逆的。所以,即使保存用户密码的数据库被攻击,也不会造成用户的密码泄漏。
最常见的哈希算法为MD5(Message-Digest Algorithm 5,信息-摘要算法5),也是计算机广泛使用的哈希算法之一。主流编程语言普遍都提供MD5实现,MD5的前身有MD2、MD3和MD4。曾经,MD5一度被广泛应用于安全领域。随着MD5的弱点不断被发现,以及计算机能力的不断提升,该算法不再适合当前的安全环境。目前,MD5计算广泛应用于错误检查。例如,在一些文件下载中,软件通过计算MD5和检验下载所得文件的完整性。MD5将输入的不定长度信息经过程序流程生成四个32位(Bit)数据,最后联合起来输出一个固定长度128位的摘要,基本处理流程包括求余、取余、调整长度、与链接变量进行循环运算等,最终得出结果。除了MD5,Java还提供了SHA1、SHA256、SHA512等哈希摘要函数的实现。除了在算法上有些差异之外,这些哈希函数的主要不同在于摘要长度,MD5生成的摘要是128位,SHA1生成的摘要是160位,SHA256生成的摘要是256位,SHA512生成的摘要是512位。
SHA-1与MD5的最大区别在于其摘要比MD5摘要长32位(相当于长4字节,转换十六进制后比MD5多8个字符)。对SHA-1强行攻击的强度比对MD5攻击的强度要大。但是SHA-1哈希过程的循环步骤比MD5多,且需要的缓存大,因此SHA-1的运行速度比MD5慢。
以下代码使用Java提供的MD5、SHA1、SHA256、SHA512等哈希摘要函数生成哈希摘要(哈希加密结果)并进行验证的案例:

package test;

import java.security.MessageDigest;

public class HashCrypto {
    /**
     * 哈希单向加密测试用例
     */
    public static String encrypt(String plain) {
        StringBuffer md5Str = new StringBuffer(32);
        try {
            /**
             * MD5
             */
            //MessageDigest md = MessageDigest.getInstance("MD5");
            /**
             * SHA-1
             */
            //MessageDigest md = MessageDigest.getInstance("SHA-1");
            /**
             * SHA-256
             */
            //MessageDigest md = MessageDigest.getInstance("SHA-256");
            /**
             * SHA-512
             */
            MessageDigest md = MessageDigest.getInstance("SHA-512");

            String charset = "UTF-8";
            byte[] array = md.digest(plain.getBytes(charset));
            for (byte b : array) {
                //转成十六进制字符串
                String hexString = Integer.toHexString((0x000000FF & b) | 0xFFFFFF00);
                log.debug("hexString:{}, 第6位之后: {}", hexString, hexString.substring(6));
                md5Str.append(hexString.substring(6));
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return md5Str.toString();
    }

    public static void main(String[] args) {
        //原始的明文字符串,也是需要加密的对象
        String plain = "123456";

        //使用哈希函数加密
        String cryptoMessage = HashCrypto.encrypt(plain);
        log.info("cryptoMessage:{}", cryptoMessage);

        //验证
        String cryptoMessage2 = HashCrypto.encrypt(plain);
        log.info("验证 {},\n是否一致:{}", cryptoMessage2,
                cryptoMessage.equals(cryptoMessage2));

        //验证2
        String plainOther = "654321";
        String cryptoMessage3 = HashCrypto.encrypt(plainOther);
        log.info("验证 {},\n是否一致:{}", cryptoMessage3,
                cryptoMessage.equals(cryptoMessage3));
    }
}

对称加密算法原理

对称加密(Symmetric Cryptography)指的是客户端自己封装一种加密算法,将给服务端发送的数据进行加密,并且将数据加密的方式(密钥)发送给密文,服务端收到密钥和数据,用密钥进行解密。
对称加密的典型处理流程大致如图所示:
对称加密的典型处理流程
对称加密:使用同一个密钥加密和解密,优点是速度快;但是它要求共享密钥,缺点是密钥管理不方便、容易泄露。
常见的对称加密算法有DES、AES等。DES加密算法出自IBM的数学研究,被美国政府正式采用之后开始广泛流传,但是近些年来使用越来越少,因为DES使用56位密钥,以现代计算能力24小时内即可被破解。虽然如此,但是在对安全要求不高的应用中,还是可以使用DES加密算法。
下面是一段使用Java语言编写的进行DES加密的演示代码:

package com.crazymakercircle.secure.crypto;
//省略import
public class DESCrypto
{
    /**
     * 对称加密
     */
    public static  byte[] encrypt(byte[] data, String password) {
        try{
            SecureRandom random = new SecureRandom();
            //使用密码,创建一个密钥描述符
            DESKeySpec desKey = new DESKeySpec(password.getBytes());
            //创建一个密钥工厂,然后用它把 DESKeySpec 密钥描述符实例转换成密钥
            SecretKeyFactory keyFactory =
                                 SecretKeyFactory.getInstance("DES");
            //通过密钥工程生成密钥
            SecretKey secretKey = keyFactory.generateSecret(desKey);
            //Cipher对象实际完成加密操作
            Cipher cipher = Cipher.getInstance("DES");
            //用密钥初始化Cipher对象
            cipher.init(Cipher.ENCRYPT_MODE, secretKey, random);
            //为数据执行加密操作
            return cipher.doFinal(data);
        }catch(Throwable e){
                e.printStackTrace();
        }
        return null;
    }
    /**
     * 对称解密
      */
    public static byte[] decrypt(byte[] cryptData,
                            String password){

        //DES算法要求有一个可信任的随机数源
        SecureRandom random = new SecureRandom();
        //创建一个 DESKeySpec 密钥描述符对象
        DESKeySpec desKey = new DESKeySpec(password.getBytes());
        //创建一个密钥工厂
        SecretKeyFactory keyFactory =
                                SecretKeyFactory.getInstance("DES");
        //将 DESKeySpec 对象转换成 SecretKey 对象
        SecretKey secretKey = keyFactory.generateSecret(desKey);
        //Cipher对象实际完成解密操作
        Cipher cipher = Cipher.getInstance("DES");
        //用密钥初始化Cipher对象
        cipher.init(Cipher.DECRYPT_MODE, secretKey, random);
        //真正开始解密操作
        return cipher.doFinal(cryptData);
    }

    public static void main(String args[]) {
        //待加密内容
        String str = "123456";
        //密码长度要是8的倍数
        String password = "12345678";

        byte[] result = DESCrypto.encrypt(str.getBytes(),password);
        log.info("str:{} 加密后:{}",str,new String(result));
        //直接将如上内容解密
        try {
            byte[] decryResult = DESCrypto.decrypt(result, password);
            log.info("解密后:{}",new String(decryResult));
        } catch (Exception e1) {
            e1.printStackTrace();
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/589103.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件测试银行金融项目如何测?看看资深测试老鸟的总结,一篇足够...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 自动化测试&#x…

如何获取ios打包证书

要获取ios证书,需要去苹果开发者中心注册苹果开发者账号,百度苹果开发者中心即可进入苹果开发者中心官网。 假如你还从来没注册过苹果开发者,你可以参考下面这篇文章先注册成为苹果开发者,必须要有苹果开发者账号才能生成ios打包…

电商客户消费预测模型-基于数千万真实在线零售数据__企业调研_论文科研_毕业设计

之前发过 《谁主沉浮?银行,消金,互联网公司的精准营销_智慧营销完全解读》介绍了智慧营销/精准营销目的是降低运营成本。但精准营销可以带来很多额外收益,例如提高销售利润,提高客户忠诚度,降低客户流失率&…

MySQL的登录与退出(图文讲解)

MySQL的登录 前言一、服务的启动与停止1、方式1:使用图形界面工具2、方式2:使用命令行工具 二、自带客户端的登录与退出1、登录方式1:MySQL自带客户端2、登录方式2:windows命令行3、退出登录 前言 本博主将用CSDN记录软件开发求学…

越秀地产K2流程平台年度报告出炉,来看看“别人家”的流程平台

前不久,越秀地产K2流程平台2022年度运营报告新鲜出炉,K2流程平台再次递交出色成绩单。 2022年,越秀地产在K2流程平台上审批完成的流程共计103万条,日均发起流程数达2800条,日均点击量5万。在大体量、高负荷情形下&…

moment获取指定日期的周x,某月最后一天

安装了moment插件的情况下,使用moment处理时间,原生的Date对象是另一回事。 非官方中文网-文档 1 当前时间 moment() 2 格式化时间 YYYY/yyyy 四位数年份 MM 两位数月份 DD 两位数天 moment().format("YYYY MM DD") 2023 05 26 moment().…

某二手车逆向研究,竟然如此……

目录 一、逆向目标二、网站分析三、加密参数分析四、加密数据分析五、思路总结六、完整项目下载七、作者Info 一、逆向目标 通过抓包技术找出请求头的加密参数,当然也包括cookie,以及响应数据中的加密过的或编码过的数据,通过xhr/fetch请求定…

lidar-camera 标定系统

摘要 本文讨论了一个视觉系统的校准问题,该系统由RGB相机和3D光学雷达(LiDAR)传感器组成。将来自不同模态的两个独立点云进行配准始终是具有挑战性的。我们提出了一种新颖、准确的校准方法,使用已知尺寸的简单纸板箱。我们的方法…

Apache网页安全与安全优化--网页缓存、隐藏版本信息、Apache 防盗链

目录 --------网页缓存-------- 1.检查是否安装 mod_expires 模块 2.如果没有安装mod_expires 模块,重新编译安装 Apache 添加 mod_expires模块 3.配置 mod_expires 模块启用 4.检查安装情况,启动服务 5.测试缓存是否生效 --------隐藏版本信息--…

公开报名|CCPTP云渗透测试认证专家第二期培训班,将在云网基础设施安全国家工程研究中心举办

CCPTP云渗透测试认证专家由云安全联盟大中华区发布,是全球首个云渗透测试能力培养课程及人才培养认证,弥补了国内云渗透测试认知的差距和技能型人才培养的空白。4月1日-13日,CCPTP 首期班成功举办,于2023年5月10日部分学员完成考试…

C语言---函数

1、函数是什么 学习库函数网站: https://cplusplus.com/reference/http://en.cppreference.comhttp://zh.cppreference.com 我们参考文档,学习几个库函数 2、库函数 3、自定义函数 自定义函数和库函数一样,有函数名,返回值类…

TLS协议在ISO13400-2-2019文档中的内容解析

我很久之前写过解读ISO13400文档的系列文章:《详解ISO 13400文档(DoIP协议)》。当时没有说明解读的是哪一版13400,现在回过头看,应该是ISO13400-2-2012版本。那一版里没有TLS协议的相关内容,所以写的文章中也没有体现。 而2019版相比2012版,有两个方面的变化: 增加TLS…

1.AI绘画简介

1.1简介 ​ AI绘画即指人工智能绘画,是一种计算机生成绘画的方式。 ​ AI绘画主要包含两个部分,一个是对图像的分析与判断,即“学习”,一个是对图像的处理和还原,即“输出”。人工智能通过对数以万计的图像及绘画作品…

汽车充电桩主板的构成及7kw交流桩的优势阐述

汽车充电桩主板的构成通常包括:中央处理器、存储器、协议转换芯片、电源管理系统、信号输入输出、充电状态指示灯、电容、电感、电阻等元件。 其中,中央处理器是充电桩的核心,可以对电动汽车进行识别和匹配,根据电动车需求充电&am…

SpringMVC01:SpringMVC的分析和创建

目录 一、Spring MVC:回顾MVC 1、什么是MVC? 2、Model1时代 3、Model2时代 4、回顾Servlet 1.新建一个Maven工程当作父工程!pom依赖 2.建立一个Moudle:springmvc-01-servlet,添加Web app的支持 3.导入servlet和jsp的jar依…

如何使用 Python 进行机器学习?

全套学习路线图、课程,机器学习工作流程如下。 Python人工智能 入门: Python基础→Python数据挖掘中级: 机器学习进阶: NLP自然语言高级: OpenCV基础→深度学习 人工智能学习路线图2023版-黑马程序员人工智能技术路…

Facebook广告投放怎么使用?Facebook广告投放的教程

做跨境电商的,多多少少都离不开广告投放,Facebook广告投放更是很多人的首选,所以东哥今天就来分享一个Facebook广告投放的教程,看完不信你还不会Facebook广告投放! Facebook广告投放的教程 1、用科学上网的方式注册一个…

2023 华为 Datacom-HCIE 真题题库 10--含解析

单项选择题 1.[试题编号:190585] (单选题)华为SD-WAN解决方案中,当CPE位 于NAT设备后的私网时,特别是两个站点的CPE同时位于NAT设备后的私网时,CPE之 间需要使用NAT穿越技术。华为SD-WAN解决方案中使用以下…

vulnhub dc-8

1.信息搜集 端口 22,80,31337 存活ip 192.168.85.136 2.访问网站,进行信息搜集 在欢迎页面发现sql注入 sqlmap进行跑数据 python sqlmap.py -u "http://192.168.85.136/?nid1" --batch -D d7db -T users -C name,pass --dump尝试robots.txt,发现后他登…

保姆级讲解,让ChatGPT成为机器人的智慧大脑

文 / 高扬(微信公众号:量子论) ChatGPT是生成式人工智能,如果能接入机器人,可以让机器人更加智能。 我手上没有硬件,但我们可以模拟尝试机器人的制作逻辑,这个设计分成两部分:硬件、…