程序员

理解区块链技术所需的密码学常识之hash算法

2018-11-25  本文已影响10人  刘娟娟

1、

要理解区块链技术,需要先构建一个基础认知。即:

- 区块链技术脱胎于“比特币”,即是比特币系统背后的那套体系;也可认为比特币是区块链技术的第一个应用项目。

- 区块链技术,是由密码学、分布式系统与共识机制所共同构成的一套机制。

该基础认知的来源,参考李笑来《这些年我看到的所谓“区块链”……》

支撑比特币系统的技术,只不过是一个电子账簿技术。只不过,它使用了分布式网络、加密算法、共识机制等技术和原理的组合,使得这种电子账簿 1)无法篡改、2)公开透明。这样的电子账簿,在比特币之前并不存在。

2、

其中, 密码学于我而言,是一个非常神秘的概念。今天用“区块链+密码学”为关键词,Google到一些基础知识点。主要的学习材料是《区块链技术》中“密码学与安全技术”章节。

信息科技这个词大家其实都不陌生哇,information technology,简称IT行业嘛。

把知识点形成结构,同时把新知识点与旧知识点形成关联,是非常好的提高效率与降低认知负担的方法。

密码学与安全技术,作为一门学科,想要达到的目的是什么?

信息安全的核心要素:机密性,完整性,可认证性,不可抵赖性。

3、

密码学与安全技术的核心知识点有以下几类:

可喜的是,过去基于对PRESSone业务的学习与理解,hash算法,加密与解密算法,数字签名等概念并不陌生,甚至还能用大白话解释一二。

但系统学习的好处是,之前的知识点,都是散乱的。现在有“书籍”这样相对成体系的学习材料,能帮助人迅速把知识点分门别类有序化。同时,在了解似乎已经掌握的知识点时,往往又能看到之前未曾留意的新知识点。

4、

有关hash算法的新知:

- hash算法是一类算法的统称,这类算法都是:

将任意长度的二进制明文串映射为较短的(通常是固定长度的)二进制串(Hash 值),并且不同的明文很难映射为相同的 Hash 值。

> 指纹(fingerprint)或摘要(digest)算法。

所以有时如果看到指纹算法或摘要算法的说法时,可不要以为是新概念。

评价一个hash算法是否优秀,看是否满足四点:

正向快速:给定原文和 Hash 算法,在有限时间和有限资源内能计算得到 Hash 值;
逆向困难:给定(若干)Hash 值,在有限时间内无法(基本不可能)逆推出原文;
输入敏感:原始输入信息发生任何改变,新产生的 Hash 值都应该发生很大变化;
碰撞避免:很难找到两段内容不同的明文,使得它们的 Hash 值一致(即发生碰撞)。

上面特意强调了,hash算法并非某一个特定的算法,而是一类算法的统称。那么目前常用的hash算法有哪些呢

包括国际上的 Message Digest(MD)系列和 Secure Hash Algorithm(SHA)系列算法,以及国内的 SM3 算法。
MD 算法主要包括 MD4 和 MD5 两个算法。
MD4 已证明不够安全。
MD5 已于 2004 年被成功碰撞,其安全性已不足应用于商业场景。

其实MD5这个概念真不陌生。早年端游时代,大家常常用MD5码来检查所下载的安装包是否准确呢!这其实就是hash算法的一大重要用途:

数字摘要是 Hash 算法重要用途之一。顾名思义,数字摘要是对原始的数字内容进行 Hash 运算,获取唯一的摘要值。

利用 Hash 函数抗碰撞性特点,数字摘要可以检测内容是否被篡改过。

细心的读者可能会注意到,有些网站在提供文件下载时,会同时提供相应的数字摘要值。用户下载原始文件后可以在本地自行计算摘要值,并与所提供摘要值进行比对,以确保文件内容没有被篡改过。

总的来说,hash算法的用途,也很丰富:

除了快速对比内容外,Hash 思想也经常被应用到基于内容的编址或命名算法中。

关于hash算法性能的知识点,则有助于理解算力攻击:

大多数 Hash 算法都是计算敏感型算法……计算芯片越强大则完成地越快
一些 Hash 算法不是计算敏感型的,例如 scrypt算法,计算过程需要大量的内存资源……可有效防范算力攻击

学习密码学有一大乐趣,就是读文章时,能立即联想到各种“攻”与“防”的精彩:

Hash 算法并不是一种加密算法,不能用于对信息的保护。

但 Hash 算法可被应用到对登录口令的保存上。例如网站登录时需要验证用户名和密码,如果网站后台直接保存用户的口令原文,一旦发生数据库泄露后果不堪设想(事实上,网站数据库泄露事件在国内外都不少见)。

利用 Hash 的防碰撞特性,后台数据库可以仅保存用户口令的 Hash 值,这样每次通过 Hash 值比对,即可判断输入口令是否正确。即便数据库泄露了,攻击者也无法轻易从 Hash 值还原回口令。

然而,有时用户设置口令的安全强度不够,采用了一些常见的字符串,如 password、123456 等。有人专门搜集了这些常见口令,计算对应的 Hash 值,制作成字典。这样通过 Hash 值可以快速反查到原始口令。这一类型以空间换时间的攻击方法包括字典攻击和彩虹表攻击(只保存一条 Hash 链的首尾值,相对字典攻击可以节省存储空间)等。

为了防范这一类攻击,可以采用加盐(Salt)的方法。保存的不是原文的直接 Hash 值,而是原文再加上一段随机字符串(即“盐”)之后的 Hash 值。Hash 结果和“盐”分别存放在不同的地方,这样只要不是两者同时泄露,攻击者很难进行破解。

看了这一段,我就开始好奇,hash算法仅仅是较多使用在区块链项目吗,有多大比例上用在了古典互联网项目中呢?为什么还会有很多“脱裤”事件呢?


著作权所有。如需转载或引用,请通过本文 PRESS.one 智能合约购买授权许可。或采用 PRESSone APP 扫码:

image.png
上一篇 下一篇

猜你喜欢

热点阅读