哈希算法和密码学

在各大影视剧中,经常会出现这样的场景,在传送一份秘密文件的时候,为了躲避敌人的入侵,经常会使用密码传送的方式,进而让消息能够顺利的别传送。很多人在看过影视剧之后,都会被密码强大的“功力”所深深折服,那么密码究竟存在着怎样的魅力呢?

密码,是通信的双方在约定的法则之下,将信息进行特殊转换的一种重要保密手段。依照其法则,可以将明文变为密文,也可以将密文。在早期。密码仅仅对文字或者是数码进行加密和脱密的变化,随着通信技术的发展,密码在语言、图像和数据方面都可进行加密和脱密的转换。

密码的不断普及衍生出了密码学,密码学是研究编制密码和破译密码的技术科学,在通常情况下,被认为是数学和计算机科学的分支,同时也和信息论密切相关。

密码学在传送信息方面起到了巨大的作用,这也为区块链资产的发展奠定了基础,比特币的发展就应用了大量的密码学知识。

密码学所涉及的技术非常广泛,包括哈希算法和摘要、加密算法、数字签名和证书等等,除此之外,还涉及到了如何使用这些技术实现信息的机密性、完整性、认证性以及不可抵赖性。

在这一节当中,我们主要讲述的是哈希算法。我们可以通过一个例子大致了解一下哈希算法。

在这个世界上的每一个人,想要参加各种各样的社会活动,都需要一个别人能够识别自己的标志。有的人会觉得这还不简单吗,名字和身份证就足以代表了。事实上,这种方式的代表是非常脆弱的,因为重名的人有很多,且伪造身份证的现象也是存在的。

除了这两种方法之外,有一个更可靠的办法,就是将一个人的所有基因序列记录下来,以此来代表这个人。这种方法能够充分的证明我们自己,却是不切合实际的。这时,我们还可以通过指纹去证明自己,这一个不错的选择,毕竟每个人的指纹都是不同的。

对于在互联网里传送的文件来说,同样需要一个标志文件的身份。就比如,我们在下载一个文件的时候,在下载的过程中,需要经过很多网络服务器和路由器,那么我们如何才能保证所下载的文件是我们所需要的呢?

我们不可能去检测文件中的每个字节,会浪费我们很多的时间。而简单地利用文件名和文件大小去检查的话,结果并不是准确的,文件名和文件大小都是极易被伪装的信息。

在这样的情况下,我们就需要像指纹一样的标志来检查文件是否我们所需要的文件,这个指纹就是我们所说的哈希算法。

由于哈希算法的这种特性,它被广泛应用于区块链工作量证明中,在信息安全方面起到了很大的作用。

哈希算法,是一种从任意文件中创造小的数字(指纹)的方法。和指纹一样,哈希算法就是一种以较短的信息,就能够保证文件是唯一的,成为文件的一种标志。这种标志和文件的每一个字节都是相关的,而且很难找到逆向的规律。因此,当原有文件发生改变时,其标志值也会发生改变,以此来告诉文件使用者当前的文件已经不再是你所需求的文件了。

这种标志除了能够保证文件的可靠性之外,能够让我们在进行文件系统同步、备份等工具的时候,使用哈希算法来标志文件唯一性,能够帮助我们减少系统的开销。这在很多的云存储服务器中能够应用。

既然哈希算法作为一种指纹,其最中的用途就是在给证书、文档、密码等高安全系统的内容进行加密保护。这主要得益于哈希算法的不可逆性。

哈希算法的不可逆性体现在,你想要获得原有的文件,是不能根据一段通过哈希算法所得到的指纹。除此之外,也不可能简单的创造一个文件,使其指纹和一段目标指纹相同。基于此,哈希算法的不可为逆性才能够维持很多安全框架的运营。

在不同的使用场景中,哈谢算法的某些特点的侧重点就会有所不同。例如,在数据结构和安全领域里,在运用哈希算法进行管理的数据结构中,是比较重视速度的,主要保证哈希的均匀分布就可以了。

就比如hashmap,hash值(key)存在的目的是加速键值对的查找,key的作用是要将元素适当地放在各个桶里。换句话说,hash出来的key,只要能够保证value大致均匀的放在不同的桶里就可以了。

但整个算法的set性能,直接与hash值产生的速度有关,因此这时候的hash值的产生速度就十分的重要。这一点我们可以以JDK中的String.hashCode方法为例:

这是很简洁的一个乘加迭代运算,在不少的哈希算法中,使用的是异或+加法进行迭代,其速度和前者差不多。

在密码学中,哈希算法主要是用于消息摘要和签名,也就是说,它主要用于对整个消息的完整性进行校验。

举个例子,我们在登陆知乎这个APP的时候,都需要输入密码,如果知乎对登陆密码进行保存的话,就很容易让黑客窃取到大家的密码来登陆,这是非常不安全的。如果,知乎就用哈希算法生成了一个密码签名,知乎后台只保存着这个签名值,因为哈希算法具有不可逆的特性,即使黑客得到了这个签名,也没有任何的用处。

因为如果你在知乎网站的登陆界面输入密码,知乎后台就会重新计算这个哈希值,并和网站中储存的哈希值进行比较,结果是相同的,就证明你是这个账户的使用者,就会允许你登陆。银行也同样采用了这种系统,银行保存的只是密码的哈希值,不会保存用户的密码和原文的。

在这些被应用的场景中,要求有很有高的抗碰撞和抗篡改能力,对速度的要求就没有那么高了。

一个设计良好的哈希算法,是具有很高的抗碰撞能力的。我们以MD5为例,其输出长度为128位,其设计概率为,这是一个非常小的数字,即使王小云破解了MD5之后,其碰撞概率上限也高达。也就是说,至少需要找次,才能有一半的概率来找到一个和目标文件相同的hash值。对于两个相似的字符串,MD5加密结果如下:

MD5(“version1”)=“966634ebf2fc135707d6753692bf4b1e”;

MD5(“version2”)=“2e0e95285f08a07dea17e7ee111b21c8”;

由此我们可以看出,仅仅是一个比特位的改变,两者的MD5值就天差地别的变化。

事实上,将哈希当成是一种加密算法,并不是不准确的。加密总是相对于解密而言的,如果没有解密,又何谈加密呢,哈希算法的设计就是以无法解密为毒地,并且如果我们不附加一个随机的salt值,哈希的口令是很容易被字典攻击入侵的。

总而言之,密码学和信息安全发展到现在,不是只言片语就能够解释得了的各种加密算法和散列算法。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180710G0KOEB00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券