单向散列函数的价值和具体实现的详细使用

关于术语

不同的参考书使用的术语有所不同:

  • 单向散列函数(one-way hash function)、消息摘要函数(message digest function)、哈希函数、杂凑函数
  • 输入的是消息(message)也称为原像(pre-image)
  • 输出的是散列值(hash value),或消息摘要(message digest),或指纹(fingerprint)
  • 完整性(integrity)/ 一致性
digest [da‘dest] vt. 消化;吸收;融会贯通 n. 文摘;摘要
hash n. 剁碎的食物;混杂,拼凑;重新表述 vt. 搞糟,把…弄乱;切细;推敲
integrity n. 完整;正直;诚实;廉正
fingerprint n. 指纹;手印 vt. 采指纹

1. 什么是单向散列函数?

1.1 这个文件是不是真的?

场景:

  • 文件的内容是通过比特序列来表现的
  • 主动攻击者Mallory(无论人为还是病毒入侵)是否篡改了文件内容?
  • 目标:确认文件"是不是真的" ,即完整性
  • 方法:
    • 回家之前事先将文件拷贝到一个安全的地方保存起来,第二天将保存的文件和使用的这个文件进行对比
      • 缺点1. 毫无意义,事先已经把文件进行安全保存,何必校验完整性,直接使用事先保存的文件来工作不就行了?
      • 缺点2:效率问题。如果文件非常巨大,那么文件的拷贝、保存以及比较都将非常耗时。
    • 单向散列函数: 获取文件的“指纹”
      • 优点:效率高(较小的指纹直接比较),用散列值对比代替文件对比
刑事侦查 文件完整性
犯罪嫌疑人的“指纹”与犯罪现场遗留的“指纹”比较 当前文件的“指纹” 与 过去文件的“指纹”
身份标识(人变了/基因变了,身份也就变了) 内容标识(衡量内容状态是否变化,防篡改;内容变了,指纹也就变了)

1.2 定义: 根据消息的内容计算(compute)散列值

  • 消息的类型: 任何类型(无论文本还是二进制),单向散列函数都将它作为单纯的比特序列来处理,即根据比特序列计算出散列值
  • 散列值的长度和消息的长度无关

1.3 性质:

  • 定长输出: 无论原始数据多长,散列值都是短且固定的
  • 能够快速计算出散列值,所花费的时间必须要短,如果不能在现实的时间内完成计算就没有意义了。
  • 消息不同散列值也不同
    • 雪崩效应: 输入的微小改变,将会引起结果的巨大不同。(抗碰撞性(collision resistance):难以发现碰撞的性质)
    • 弱碰撞性:要找到和该条消息具有相同的散列值的另外一条消息是非常困难的
    • 强碰撞性:要找到散列值相同的两条不同的消息是非常困难的。
  • 具备单向性: 无法通过散列值反算出消息(就像玻璃杯砸的粉碎很容易,却无法将碎片还原成完整的玻璃一样)
    • 并不是一种加密,无法通过解密将散列值还原为原来的消息

散列:hash:,愿意是古法语中的“斧头”,后来被引申为“剁碎的肉末”,也许是用斧子一通乱剁再搅在一起的感觉。 单向散列函数的作用,实际上就是将很长的消息剁碎,然后再混合成固定长度的散列值。

1.4 实际应用

  • 检测软件是否被篡改

    • 为了减轻服务器的压力,很多软件作者都会借助多个网站(镜像站点)来发布软件。
    • 用户将下载到的软件,自行计算散列值,然后与官方网站公布的散列值进行对比,从而确保自己下载的文件是完整的。
  • 基于口令的加密(Password Based Encryption,PBE)
    • 原理:将口令和盐(salt,通过伪随机数生成器产生的随机值)混合后计算其散列值(KEK),然后将这个散列值用作加密的秘钥。(防御字典攻击)
    • 利用单向性生成KEK(密钥加密秘钥)秘钥,使用对称密码加密CEK(内容加密秘钥),用于保护CEK
  • 消息认证码
  • 数字签名: 对消息的散列值签名而不是对消息内容签名,处理速度快。
  • 伪随机数生成器: 利用单向性构造
  • 一次性口令(one-time password)

2. 具体例子

  • MD4,MD5

    • 由Rivest设计,均能够产生128比特的散列值
    • 强抗碰撞性已经被攻破
  • SHA-1,SHA-224,SHA-256,SHA-384, SHA-512
    • 由NIST(National Institute of Standards and Technology,美国国家标准技术研究所)设计
    • SHA-1 产生160比特的散列值,强抗碰撞性已于2005年被攻破
    • SHA-2 (SHA-224,SHA-256,SHA-384, SHA-512)分别可产生对应比特数的散列值,尚未被攻破
  • RIPEMD-160: 欧盟RIPE项目设计
  • AHS(Advanced Hash Standard) 与SHA-3: NIST已着手制定用于取代SHA-1的下一代单向散列函数SHA-3

3. 尚未解决的问题

  • 能够辨认出“篡改”,但无法辨别出“伪装”,我们还需要认证(消息认证码和数字签名)。

-----工具使用举例--------(MD5,SHA-1,SHA-256,SHA-512等等使用方法相同)

MD5SUM(1)                        User Commands                       MD5SUM(1)

Usage: md5sum [OPTION]... [FILE]...

compute and check MD5 (128-bit) message digest

1.打印(计算)MD5(128位)校验和

2.检查MD5(128位)校验和

With no FILE, or when FILE is -, read standard input. 如果没有FILE或者FILE为‘-’,将从标准输入读入

-b, --binary            read in binary mode  以二进制模式读入

-c, --check             read MD5 sums from the FILEs and check them  从FILES读取MD5 sums,然后校验他们

-t, --text              read in text mode (default) 以文本模式读入(默认)

Note: There is no difference between binary and text mode option on GNU system.

提示: 如果在GUN 系统上,binary和text模式无任何区别。

---------------------------------------

The following three options are useful only when verifying checksums: 仅仅当查证校验和的时候,下面3个选项非常有用!

--quiet             don‘t print OK for each successfully verified file 被查证的文件如果成功,不打印OK(即仅仅显示错误信息,屏蔽验证正确的文件)

--status            don‘t output anything, status code shows success 不输入任何东西,状态码显示success (即无论正确与否,都不输出任何信息,echo $?看最后结果)

-w, --warn        warn about improperly formatted checksum lines 关于非合法的格式的checksum行,抛出warning,如此之外,不予显示

--help     display this help and exit

--version  output version information and exit

The sums are computed as described in RFC 1321.  When checking, the input

should be a former output of this program.  当检查时,输入的应该是之前程序的输出。

The default mode is to print a line with checksum, a character indicating type a character indi-cating type (‘*’ for binary, ‘ ’ for text), and name for each FILE.

默认的mode和checksum合并为一行打印,一个字符指出mode的类型(* 为二进制,空为text),每个FILE为name

Report md5sum bugs to [email protected]

GNU coreutils home page: <http://www.gnu.org/software/coreutils/>

General help using GNU software: <http://www.gnu.org/gethelp/>

For complete documentation, run: info coreutils ‘md5sum invocation‘

PS:

$ openssl dgst -md5  test.enc

MD5(test.enc)= 9a8ca202880547463da5796c6d29f611

$ md5sum test.enc

9a8ca202880547463da5796c6d29f611  test.enc

时间: 2024-12-16 16:10:25

单向散列函数的价值和具体实现的详细使用的相关文章

密码学初级教程(二)公钥密码RSA与单向散列函数与消息认证码

求离散对数非常困难 RSA是Ron Rivest/Adi Shamir/Leonard Adleman的姓氏首字母组成. RSA可以被用于公钥密码和数字签名. RSA加密:密文=明文EmodN(E和N为公钥) RSA解密:明文=密文DmodN(D和N为私钥) 对RSA的破解: 暴力破解:暴力破解的难度会随着D的长度增加而变大,当D足够长时,就不可能在现实的时间内通过暴力破解找出D. 混合密码系统:用对称密码提高速度,用公钥密码保护会话密钥 混合密码系统的组成机制: 用对称密码加密消息 通过伪随机

数字签名、数字证书、对称加密算法、非对称加密算法、单向加密(散列算法)

数字签名是什么? 1. 鲍勃有两把钥匙,一把是公钥,另一把是私钥. 2. 鲍勃把公钥送给他的朋友们----帕蒂.道格.苏珊----每人一把. 3. 苏珊给鲍勃写信,写完后用鲍勃的公钥加密,达到保密的效果. 4. 鲍勃收信后,用私钥解密,看到信件内容. 5. 鲍勃给苏珊回信,写完后用Hash函数,生成信件的摘要(digest). 6. 然后,鲍勃使用私钥,对这个摘要加密,生成"数字签名"(signature). 7. 鲍勃将这个签名,附在信件下面,一起发给苏珊. 8. 苏珊收信后,取下数

常用加密算法的Java实现(一)——单向加密算法MD5和SHA

1.Java的安全体系架构 1.1           Java的安全体系架构介绍 Java中为安全框架提供类和接口.JDK 安全 API 是 Java 编程语言的核心 API,位于 java.security包(及其子包),以及sun.securityAPI包(及其子包)中.设计用于帮助开发人员在程序中同时使用低级和高级安全功能. JDK 1.1 中第一次发布的 JDK 安全中引入了“Java 加密体系结构”(JCA),指的是用于访问和开发 Java平台密码功能的构架.在 JDK 1.1 中,

网络安全-安全散列函数,信息摘要SHA-1,MD5原理

-----------------------------------------------欢迎查看网络安全连载博客-----------------------------------[网络安全]-安全散列函数.信息摘要SHA-1.MD5算法       [网络安全]-非对称加密,RSA算法,数字签名[网络安全]-RSA非对称算法算法.数字签名                         [网络安全]-建立安全socket连接.登录[网络安全]-[数字证书,证书链]-----------

PHP-密码学算法及其应用-散列函数

转自http://www.smatrix.org/bbs/simple/index.php?t5591.html //////////////////////////////////////////////////////////////////////////////目录1.    PHP的散列函数及其应用2.    PHP中的对称密码算法及其应用3.    PHP的公钥密码算法及其应用//////////////////////////////////////////////////////

单向散列加密

开发中有一种场景,就是只需要验证正确性而不需要知道它的原文,只需要知道这个值是否存在是否相等就可以了.比如前端登录将用户的密码加密给服务端并存储到数据库.或者验证文件唯一性等.这时就要用到单向散列加密. 单向散列函数特点 1. 对任意长度的消息散列值是定长的. 2. 散列计算速度快,非常高效. 3. 明文不同,散列加密后的密文一定不同:明文相同,散列加密后密文一定相同. 4. 具备单向性,无法逆推计算. 单向散列函数也被称为哈希函数,摘要函数或者杂凑函数.其经典算法有 md5 | sha | s

Hash (散列函数)

Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值.这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值.简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数. 常用HASH函数 ·直接取余法:f(x):= x mod maxM ; maxM一般是不太接

2016012030+王超超+散列函数的应用及其安全性

一.散列函数的具体应用 1.单向散列函数在密码学中的应用     A.数字签名技术       a. 利用单向散列函数计算出需要签名的消息的邮摘,再利用签名算法对邮摘签名来代替直接对原来的消息进行签名.        b.有效地提高了签名的效率和速度,也减少了传输的信息量,节约了网络的带宽.     B.消息的完整性认证        a.通常做法是文件的所有者用Hash算法计算出文件的Hash值,自己保存Hash值的一份拷贝,然后把文件存放在一个公开的地方.需要验证一个           文

散列函数的应用及其安全性

散列函数的应用及其安全性 一.散列函数的具体应用 Hash(散列函数),一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值.这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值.简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数. 由于散列函数的应用的多样性,它们