HASH与对称加密详解

发布时间 2023-12-13 16:17:23作者: ZhangShengjie

HASH概述

Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数
常见的哈希算法
  • -MD5
  • --SHA1/256/512
  • -- HMAC

Hash的特点

  • 算法是公开的
  • 对相同数据运算,得到的结果是一样的
  • 对不同数据运算,如MD5得到的结果默认是128位,32个字符(16进制标识)。
  • 没法逆运算
  • 信息摘要,信息“指纹”,是用来做数据识别的

HASH用途

  1. 密码加密

  • 可以使用RSA加密吗?

  不可以-有安全隐患
  • 比如如果客户端加密字符串-服务器解密-密码直接明文存储
  • 知己存储客户端加密后的字符串、私钥泄露
  • 两个原则:
  1. 网络上不允许明文传递用户隐私信息!
  2. 本地不允许明文保存用户隐私信息!【即使源码泄露也不能获取用户密码】
  • 直接使用MD5

  • 不安全可以反查 www.cmd5.com
  • MD5加盐

let salt = "@*&%rererwerrrtryrtrsdesdsd"
("123"+salt).md5
  • 不安全- 写死在程序中的一旦泄露就不安全了
  • HMAC加密方案

let salt = "@*&%rererwerrrtryrtrsdesdsd"
pwd.hmacMD5StringWithkey(salt);
  1. 使用一个密钥加密,并且做两次散列
  2. 在实际开发中,密钥来自于服务器(动态的)
  3. 一个账号,对应一个KEY,而且还可以更新 [比如登录的时候]
  • 上面这种方式还能优化吗 有什么安全隐患?
  • 黑客网络劫持 直接获取到了密码e10adc3949ba59abbe56e057f20f883e
  • 拿到这个密码直接做登录操作
  • 优化方案
(pwd.+"当前时间").md5
时间:服务器时间 -- 202312081010
1.((HMAC哈希值)+201811022037).md5
2.(HMAC哈希值)+201811022031
如果对比不上、服务器需要上移一分钟继续做对比

  2.搜索引擎

  拆词搜索
"海创" "四川" "iOS"
  • 把拆分的词语hash一下得到128位的二进制
  • 核心算法:然后把hash值按位相加,然后就能找到相应hash值的内容

  版权

  • 视频平台会在文件在第一次上传的时候会保存当前文件的hash值-然后对视频进行处理
  • 以后下载的都不是原文件了,再次上传hash值对不上 -- 盗版的
  • 百度云-腾讯云上传文件的时候---如果hash值对上加上其他算法--判断一致了-秒传

  数字签名

为什么用签名这个词.因为老外喜欢用支票,支票上面的签名能够证明这东西是你的.那么数字签名顾名思义,就是用于鉴别数字信息的方法
接下来我们思考一下.想要证明数字信息(也就是二进制数据,计算机里面的任意数据)的有效性,那么使用什么方式最合适呢? 我们可以想到有"信息指纹"之称的HASH算法,在之前也讲到HASH算法专门用来做文件数据的识别.那么在网络数据传递的过程中,我们可以将明文数据,和数据的HASH值一起传递给对方.对方可以拿出HASH值来进行验证. 但是在这个过程中,如何做到数据的保护呢?明文数据和HASH值如果直接传递就有都被篡改的风险.所以这里我们要对数据进行加密.明文数据有时会比较大,不适合使用RSA非对称加密算法,那么数据的HASH值是比较小的.这个数据是用于校验的,它完全可以使用RSA来加密.所以在数据传递的时候,我们将明文数据加上通过RSA加密的校验数据一并传递给对方.那么这个通过RSA加密的校验数据,我们称之为签名.

数字签名的验证过程

当对方拿到数据之后,如何进行验证呢?
  • 首先传递数据时会将原始的数据和数字签名一起发送
  • 对方拿到数据后,先进行校验.拿到原始数据,通过同样的HASH算法得到数据的HASH值.
  • 然后通过非对称加密,将数字签名中的校验HASH值解密出来.
  • 最后对比两个HASH值是否一致.这样可以很好的判断数据是否被篡改!

对称加密

对称加密方式:明文通过密钥加密得到密文。密文通过密钥解密得到明文

常见算法

  • DES 数据加密标准(用得少,因为强度不够)
  • 3DES 使用3个密钥,对相同的数据执行3次加密,强度增强
  • AES 高级密码标准。《比如苹果的钥匙串访问》、FBI

应用模式

  1. ECB(Electronic Code Book):电子密码本模式。每一块数据,独立加密。
  • 最基本的加密模式,也就是通常理解的加密,相同的明文将永远加密成相同的密文,无初始向量,容易受到密码本重放攻击,一般情况下很少用。
  1. CBC(Cipher Block Chaining):密码分组链接模式。使用一个密钥和一个初始化向量[IV]对数据执行加密。
  • 明文被加密前要与前面的密文进行异或运算后再加密,因此只要选择不同的初始向量,相同的密文加密后会形成不同的密文,这是目前应用最广泛的模式。CBC加密后的密文是上下文相关的,但明文的错误不会传递到后续分组,但如果一个分组丢失,后面的分组将全部作废(同步错误)。
  • CBC可以有效的保证密文的完整性,如果一个数据块在传递时丢失或改变,后面的数据将无法正常解密。

终端演示

OpenSSL

当涉及OpenSSL时,它是一个开源的软件库,主要用于提供加密和安全功能。以下是一些关键的功能和用途:
  1. 加密和解密操作: OpenSSL支持各种加密算法,包括对称加密(如AES、DES、3DES等)和非对称加密(如RSA、DSA、ECC等)。这允许开发人员对数据进行加密以确保隐私和安全,同时能够进行解密以访问原始数据。
  2. 数字证书管理: OpenSSL支持证书的创建、签名、验证以及管理。它能够处理X.509证书,用于安全地验证通信方的身份,确保数据传输的完整性和可信度。
  3. 安全套接层(SSL)和传输层安全(TLS)支持: OpenSSL提供了实现SSL和TLS协议的功能,允许安全地在网络上进行通信,保护数据免受窃听和篡改。
  4. 安全哈希函数: 它支持多种安全哈希算法,如MD5、SHA-1、SHA-256等,用于生成数据的哈希值,通常用于验证数据完整性或创建数字签名。
  5. 密码学函数和工具: OpenSSL提供了丰富的密码学函数和工具,可以用于密钥生成、随机数生成、消息认证码(MAC)计算等。
  6. 跨平台性: OpenSSL是跨平台的,可以在多种操作系统上使用,包括Linux、Windows、macOS等,也可以与多种编程语言进行集成,如C、C++、Python等。
由于其功能强大且灵活性高,OpenSSL被广泛应用于许多网络应用程序和系统中,用于加密通信、保护数据、身份验证以及确保网络安全。
加密
AES(ECB)加密“hello”字符串
$ echo -n hello | openssl enc -aes-128-ecb -K 616263 -nosalt | base64
AES(CBC)加密“hello”字符串
$ echo -n hello | openssl enc -aes-128-cbc -iv 0102030405060708 -K 616263 -nosalt | base64\
解密:
AES(ECB)解密
$ echo -n d1QG4T2tivoi0Kiu3NEmZQ== | base64 -D | openssl enc -aes-128-ecb -K 616263 -nosalt –d
AES(CBC)解密
$ echo -n u3W/N816uzFpcg6pZ+kbdg== | base64 -D | openssl enc -aes-128-cbc -iv 0102030405060708 -K 616263 -nosalt –d
 ecb 加密text.txt
修改一个字符后继续加密
cbc 加密text.txt
修改一个字符后继续加密