哈希函数和数字签名

1. 哈希函数 Hash

1.1 概念

  • Hash,一般翻译做散列,也有直接音译为哈希的。就是把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值。
  • 这种转换是一种压缩映射,也就是散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说,就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
  • 单向散列函数:又称单向Hash函数、杂凑函数,就是把任意长的输入消息串变化成固定长的输出串且由输出串难以得到输入串的一种函数。这个输出串称为该消息的散列值。一般用于产生消息摘要,密钥加密等.

1.2 特点

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

1.3 用途

  • 用户密码的加密
  • 搜索引擎,关键字识别(搜索多个关键字,先对每个关键字进行散列,然后多个关键字进行或运算,如果值一致则搜索结果一致)
  • 版权标注 对文件进行散列判断该文件是否是正版或原版的
  • 数字签名 (文件完整性验证 对整个文件进行散列,比较散列值判断文件是否完整或被篡改)

2 常见的哈希加密算法

MD5,HMAC,SHA1,SHA256

2.1 MD5

MD5即Message - Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。
-----百度百科

  • 从一段字符串中通过相应特征生成一段32位的数字字母混合码。对输入信息生成唯一的128位散列值(32个16进制的数字)
  • 所有的数据(视频、音频、文件、只要存在于硬盘或内存中的)都是可以被MD5加密的,得到的都是32个字符。

特征:

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

2.2 HMAC

消息认证机制(HMAC)简单说明

  1. 原理
    1. 消息的发送者和接收者有一个共享密钥
    2. 发送者使用共享密钥对消息加密计算得到MAC值(消息认证码)
    3. 消息接收者使用共享密钥对消息加密计算得到MAC值
    4. 比较两个MAC值是否一致
  2. 使用
    1. 客户端需要在发送的时候把(消息)+(消息·HMAC)一起发送给服务器
    2. 服务器接收到数据后,对拿到的消息用共享的KEY进行HMAC,比较是否一致,如果一致则信任

2.3 SHA

安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。该算法经过加密专家多年来的发展和改进已日益完善,并被广泛使用。该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。散列函数值可以说是对明文的一种“指纹”或是“摘要”所以对散列值的数字签名就可以视为对此明文的数字签名。

SHA是美国国家标准技术研究所发布的国家标准FIPS PUB 180,最新的标准已经于2008年更新到FIPS PUB 180-3。其中规定了SHA-1,SHA-224,SHA-256,SHA-384,SHA-512这几种单向散列算法。SHA-1,SHA-224和SHA-256适用于长度不超过264二进制位的消息。SHA-384和SHA-512适用于长度不超过2128二进制位的消息。

3. 数字签名

数字签名本质上是通过HASH算法和RSA加密来实现的。
HASH算法专门用来做文件数据的识别.那么在网络数据传递的过程中,我们可以将明文数据,和数据的HASH值一起传递给对方.对方可以拿出HASH值来进行验证。
但是在这个过程中,如何做到数据的保护呢?明文数据和HASH值如果直接传递就有都被篡改的风险.所以这里我们要对数据进行加密。明文数据有时会比较大,不适合使用RSA非对称加密算法,那么数据的HASH值是比较小的。这个数据是用于校验的,它完全可以使用RSA来加密。所以在数据传递的时候,我们将明文数据加上通过RSA加密的校验数据一并传递给对方。那么这个通过RSA加密的校验数据,我们称之为签名。

3.1 验证数字签名

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

请我喝杯咖啡吧~

支付宝
微信