转自:哈希(Hash)与加密(Encrypt)的基本原理、区别及工程应用

0、摘要

今天看到吉日嘎拉的一篇关于管理软件中信息加密和安全的文章,感觉非常有实际意义。文中作者从实践经验出发,讨论了信息管理软件中如何通过哈希和加密进行数据保护。但是从文章评论中也可以看出很多朋友对这个方面一些基本概念比较模糊,这样就容易“照葫芦画瓢”,不能根据自身具体情况灵活选择和使用各种哈希和加密方式。本文不对哈希和加密做过于深入的讨论,而是对哈希和加密的基本概念和原理进行阐述、比较,并结合具体实践说明如何选择哈希和加密算法、如何提高安全性等问题,使朋友们做到“知其然,知其所以然”,这样就能通过分析具体情况,灵活运用哈希和加密保护数据。

1、哈希(Hash)与加密(Encrypt)的区别

在本文开始,我需要首先从直观层面阐述哈希(Hash)和加密(Encrypt)的区别,因为我见过很多朋友对这两个概念不是很清晰,容易混淆两者。而正确区别两者是正确选择和使用哈希与加密的基础。

概括来说,哈希(Hash)是将目标文本转换成具有相同长度的、不可逆的杂凑字符串(或叫做消息摘要),而加密(Encrypt)是将目标文本转换成具有不同长度的、可逆的密文。

具体来说,两者有如下重要区别:

1、哈希算法往往被设计成生成具有相同长度的文本,而加密算法生成的文本长度与明文本身的长度有关。

例如,设我们有两段文本:“Microsoft”和“Google”。两者使用某种哈希算法得到的结果分别为:“140864078AECA1C7C35B4BEB33C53C34”和“8B36E9207C24C76E6719268E49201D94”,而使用某种加密算法的到的结果分别为“Njdsptpgu”和“Hpphmf”。可以看到,哈希的结果具有相同的长度,而加密的结果则长度不同。实际上,如果使用相同的哈希算法,不论你的输入有多么长,得到的结果长度是一个常数,而加密算法往往与明文的长度成正比。

2、哈希算法是不可逆的,而加密算法是可逆的。

这里的不可逆有两层含义,一是“给定一个哈希结果R,没有方法将E转换成原目标文本S”,二是“给定哈希结果R,即使知道一段文本S的哈希结果为R,也不能断言当初的目标文本就是S”。其实稍微想想就知道,哈希是不可能可逆的,因为如果可逆,那么哈希就是世界上最强悍的压缩方式了——能将任意大小的文件压缩成固定大小。

加密则不同,给定加密后的密文R,存在一种方法可以将R确定的转换为加密前的明文S。

这里先从直观层面简单介绍两者的区别,等下文从数学角度对两者做严谨描述后,读者朋友就知道为什么会有这两个区别了。

2、哈希(Hash)与加密(Encrypt)的数学基础

从数学角度讲,哈希和加密都是一个映射。下面正式定义两者:

      一个哈希算法是一个多对一映射,给定目标文本S,H可以将其唯一映射为R,并且对于所有S,R具有相同的长度。由于是多对一映射,所以H不存在逆映射

使得R转换为唯一的S。

      一个加密算法是一个一一映射,其中第二个参数叫做加密密钥,E可以将给定的明文S结合加密密钥Ke唯一映射为密文R,并且存在另一个一一映射,可以结合Kd将密文R唯一映射为对应明文S,其中Kd叫做解密密钥。

下图是哈希和加密过程的图示:

有了以上定义,就很清楚为什么会存在上文提到的两个区别了。由于哈希算法的定义域是一个无限集合,而值域是一个有限集合,将无限集合映射到有限集合,根据“鸽笼原理(Pigeonhole principle)”,每个哈希结果都存在无数个可能的目标文本,因此哈希不是一一映射,是不可逆的。

而加密算法是一一映射,因此理论上来说是可逆的。

但是,符合上面两个定义的映射仅仅可以被叫做哈希算法和加密算法,但未必是好的哈希和加密,好的哈希和加密往往需要一些附加条件,下面介绍这些内容。

一个设计良好的哈希算法应该很难从哈希结果找到哈希目标文本的碰撞(Collision)。那么什么是碰撞呢?对于一个哈希算法H,如果,则S1和S2互为碰撞。关于为什么好的哈希需要难以寻找碰撞,在下面讲应用的时候会详解。另外,好的哈希算法应该对于输入的改变极其敏感,即使输入有很小的改动,如一亿个字符变了一个字符,那么结果应该截然不同。这就是为什么哈希可以用来检测软件的完整性。

一个设计良好的加密算法应该是一个“单向陷门函数(Trapdoor one-way function)”,单向陷门函数的特点是一般情况下即使知道函数本身也很难将函数的值转换回函数的自变量,具体到加密也就是说很难从密文得到明文,虽然从理论上这是可行的,而“陷门”是一个特殊的元素,一旦知道了陷门,则这种逆转换则非常容易进行,具体到加密算法,陷门就是密钥。

顺便提一句,在加密中,应该保密的仅仅是明文和密钥。也就是说我们通常假设攻击者对加密算法和密文了如指掌,因此加密的安全性应该仅仅依赖于密钥而不是依赖于假设攻击者不知道加密算法。

3、哈希(Hash)与加密(Encrypt)在软件开发中的应用

哈希与加密在现代工程领域应用非常广泛,在计算机领域也发挥了很大作用,这里我们仅仅讨论在平常的软件开发中最常见的应用——数据保护。

所谓数据保护,是指在数据库被非法访问的情况下,保护敏感数据不被非法访问者直接获取。这是非常有现实意义的,试想一个公司的安保系统数据库服务器被入侵,入侵者获得了所有数据库数据的查看权限,如果管理员的口令(Password)被明文保存在数据库中,则入侵者可以进入安保系统,将整个公司的安保设施关闭,或者删除安保系统中所有的信息,这是非常严重的后果。但是,如果口令经过良好的哈希或加密,使得入侵者无法获得口令明文,那么最多的损失只是被入侵者看到了数据库中的数据,而入侵者无法使用管理员身份进入安保系统作恶。

3.1、哈希(Hash)与加密(Encrypt)的选择

要实现上述的数据保护,可以选择使用哈希或加密两种方式。那么在什么时候该选择哈希、什么时候该选择加密呢?

基本原则是:如果被保护数据仅仅用作比较验证,在以后不需要还原成明文形式,则使用哈希;如果被保护数据在以后需要被还原成明文,则需要使用加密。

例如,你正在做一个系统,你打算当用户忘记自己的登录口令时,重置此用户口令为一个随机口令,而后将此随机口令发给用户,让用户下次使用此口令登录,则适合使用哈希。实际上很多网站都是这么做的,想想你以前登录过的很多网站,是不是当你忘记口令的时候,网站并不是将你忘记的口令发送给你,而是发送给你一个新的、随机的口令,然后让你用这个新口令登录。这是因为你在注册时输入的口令被哈希后存储在数据库里,而哈希算法不可逆,所以即使是网站管理员也不可能通过哈希结果复原你的口令,而只能重置口令。

相反,如果你做的系统要求在用户忘记口令的时候必须将原口令发送给用户,而不是重置其口令,则必须选择加密而不是哈希。

完整文档参考:

哈希(Hash)与加密(Encrypt)的基本原理、区别及工程应用

hash和encrypt区别及应用_转相关推荐

  1. 一致性hash和redis中hash槽的区别

    一致性hash主要用于分布式系统中,用于解决数据选择节点存储.选择节点访问.增删节点后数据的迁移和重分布问题.redis集群并没有使用一致性hash,而是使用了hash槽来解决数据分配的问题. 一致性 ...

  2. MySQL的btree索引和hash索引的区别

    Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-T ...

  3. hash 值重复_MySQL调优实战:MySQL B+Tree索引和Hash索引的区别?

    点击上方"Java分享吧",选择"设为星标" 优选有价值的技术文献,从我做起 MySQL技术篇章 1.B+Tree索引 1.B+Tree首先是有序结构,为了不至 ...

  4. 数据库:B+树索引和Hash索引得区别

    导读 在MySQL里常用的索引数据结构有B+树索引和哈希索引两种,我们来看下这两种索引数据结构的区别及其不同的应用建议. 二者区别 备注:先说下, 在MySQL文档里,实际上是把B+树索引写成了BTR ...

  5. mysql btree检索策略_MySQL之Btree索引和HASH索引的区别以及索引优化策略

    索引是帮助mysql获取数据的数据结构.最常见的索引是Btree索引和Hash索引. 不同的引擎对于索引有不同的支持:Innodb和MyISAM默认的索引是Btree索引:而Mermory默认的索引是 ...

  6. vueRouter history模式和hash模式的区别

    很长一段时间没有写博客了,换了个工作,就搁置了一段时间了,从今天开始,博客依旧会慢慢跟新,请大家多多支持. 前言 今天我们来谈谈vue 的路由vueRouter.我将会分2篇文章来带大家彻底理透vue ...

  7. @ini_get php,php中get_cfg_var()和ini_get()的用法及区别_php技巧_脚本之家

    本文实例讲述了php中get_cfg_var()和ini_get()的用法及区别.分享给大家供大家参考.具体分析如下: php里get_cfg_var()和ini_get()都是取得配置值的函数,当你 ...

  8. 15g1和g2和g3区别大吗_河南成人高考和普通高考的区别有哪些?成人高考难度会越来越大吗?...

    成人高考是我国成人高等学校选拔合格的毕业生以进入更高层次学历教育的入学考试,属于国民教育系列教育,已经列入国家招生计划.成人高考和普通高考一样,属于全国统考.那么河南成人高考和普通高考的区别有哪些?成 ...

  9. java和c++的区别大吗_安徽成人高考和自考区别大吗?为什么推荐选成人高考?

    安徽成人高考和自考区别大吗?为什么推荐选成人高考?成人教育考试中有自考和成人高考,但是很多人都会选择成人高考,而不去选择学习时间更为自由的自考,那么自考就那么的不适合选择吗?具体就来说说他们的区别. ...

最新文章

  1. mysql+不锁表添加字段_MySQL5.6在线DDL不锁表(在线添加字段)
  2. 7-7 字符串修改 (15 分)
  3. 秦磊:被分众CEO“忽悠”往事
  4. 关闭linux防火墙及selinux的关闭
  5. 改善深层神经网络:超参数调整、正则化以及优化——2.1 Mini-batch梯度下降
  6. 基于JAVA+SpringMVC+Mybatis+MYSQL的网上商城
  7. 用GO语言开发editplus编辑器插件(附源码)
  8. html做偶像图片2048小游戏,一个自制的2048小游戏(一)
  9. 导出excel 数据取一次合理还是分页取合理_一张报表模板替代数百张Excel表格,用它让报表工作更轻松...
  10. Clang与LLVM的关系
  11. 虚拟机客户端访问不了服务器域名,虚拟机ESXI 篇四:让你电脑打开网页不用等待---SmartDns...
  12. Ubuntu18.04 安装 网易云音乐 解决 打不开的问题
  13. “AIIA”杯-国家电网-电力专业领域词汇挖掘
  14. 【MYSQL】【基础知识】【MySQL的基本使用】
  15. 教程:个人深度学习工作站配置指南
  16. 论文摘要怎么写——分享5个较好的摘要
  17. element-plus ui表格表头筛选功能
  18. 赵小楼《天道》《遥远的救世主》深度解析(134)做了你该做的,就要受你该受的
  19. cs224u Overview of the Stanford Sentiment Treebank
  20. PHP基本语法--php基础最详细教程

热门文章

  1. oracle中循环读出一个表的信息插入到另外一个表中
  2. Redis介绍及常用命令【转载】
  3. ajax 中文日历显示
  4. 在工作中能学到的东西-2
  5. php file取不到手机相册,webuploader移动端选择文件无法打开手机相册的解决办法...
  6. 存PHP,数据存储 · PHP – Bmob后端云
  7. php和python_c语言,python和c语言的主要区别
  8. php替换图片_php实现图片上传并进行替换操作
  9. pg注释某一段语句不执行_@Autowired的使用:推荐对构造函数进行注释
  10. swiftui动画之tab自定义切换动画_Unity动画系统详解1:在Unity中如何制作动画?