目录
哈希函数
- 哈希函数
- 哈希密码
- 密钥派生(衍生)函数
- 非密码学哈希
- 差错校验、校验和
- 小节
正文
哈希函数
hash英语原本就是"混乱"、“拼写”、"重新表现"的意思。
在一定程度上,标签是与排列相反的动作。 排序是将集合中的元素对准某一个地方。 例如,将词典顺序一起排列,计算哈希值,打破元素之间的原始关系,将集合中的元素按照哈希函数的分类排列。 哈希函数是以随机顺序排列元素的。 因此,散列函数的最大特点是随机性。 使用散列函数的数据一看没有任何顺序,找不到任何数学规则。
函数学解析函数具有强烈的单向性,还具有与输入长度无关的固定输出长度的特性。 哈希函数的输入长度是任意的,无论是字符串还是数千万,只要使用同样的哈希函数,输出结果长度都是固定的。 另外,散列函数的特点是,虽然通过输入通过函数计算结果非常简单,但很难计算出从结果倒过来的值。 另外,如果输入的值稍微改变一点,输出结果就会完全不同。
哈希密码
这是通过一次性加密密码而形成的杂乱且不重复的字符串。 该加密过程被认为是不可逆转的,这意味着在哈希函数的输出中无法恢复原来的输入。 这是利用散列函数的单向性的例子。 密码哈希必须在第一次注册密码时使用。 首先,用户输入的密码通过单向哈希函数接收相应的哈希值并存储在服务器中。 用户登录时必须输入密码,但输入的值通过哈希函数再次获得一个输出值。 比较这次输出的结果值和存储在服务器上的哈希函数值。 如果比较结果一致,就可以进行身份认证。 密码解析的优点就是即使直接存储在服务器上,也会受到攻击,即使该密码信息被泄露,也无法根据单向获得用户的密码。
密钥派生(衍生)函数
密钥衍生函数(KDF)是从主密钥、密码等部分秘密值中衍生对称密钥的决定性算法。 KDF种类很多,有bcrypt、crypt、PBKDF2、scrypt、HKDF等多种存在。 在密码学中,KDF使用伪随机数生成器来派生出主密钥中的一个或多个子密钥。 KDF可以更长地扩展密钥或获得期望类型的密钥。 (eg. Diffie-Hellman 键交换的结果–组要素转换为AES用对称键。) 密钥派生函数与秘密参数一起使用,以便在共同秘密值中诱导一个或多个键。 这种使用可以防止获得衍生密钥的攻击者学习秘密值或其他诱导密钥输入的有用信息。
秘密因子叫做salt。 KDFs最普通的用途是使用盐,用密码解析方法验证密码。 KDFs一般也是多边密钥协商协议的构成要素。 该核心追悼函数的例子包括KDF1和ANSI X9.42的类似功能。 特别是,基于HMAC的提取和扩展密钥导出功能(HKDF)是一种简单的基于HMAC的KDF,可以用作各种协议和应用的构建块。
非密码学哈希
非密码的哈希函数被用于无需从安全方面进行验证的检查。 与密码的哈希函数相比,最大的差异点是碰撞抵抗性相关的力量。 对哈希冲突要安全。 其特点是,在计算上很难找到生成相同哈希值的两个输入值。 哈希函数也是数学的计算方法,因此,在某些情况下,即使是完全相同的输入,也会出现同样的结果。 例如,输入x时输出为y的话,在数学理论上存在着可以输出y的z。 问题是该z能找到多少,满足这些条件的z数量是多少,是决定性的因素。 即,很难找到这种z值的难度,如果数量少,就会具有强烈的抗撞性,因此是密码学的解析函数。 相反,如果不忠实于这些条件,则属于非密码函数。
使用非密码的哈希函数的剧本也很多。 代表性的例子,数据库里有哈希表。 Hashtable是使用Jukey储存数据的资料结构之一,是可以快速检查数据的资料结构。 哈希表将哈希函数应用于每个键值,生成排列固有的索引,并利用该索引存储或搜索值。
当然,非密码的哈希函数也与密码的哈希函数具有共同点。 为了尽快找到数据,储存的位置也要考虑好。 哈希函数的定义具有将键改变为固定长度的哈希值的作用。 只要将键输入到哈希函数中,将其输出视为哈希就可以,并且该哈希成为存储位置即可。 最终,哈希函数是用钥匙制造哈希的函数。
差错校验、校验和
Redundancy(冗余): 这是附加到通信数据的一部分的附加数据。 用于检查错误。 当通过通信传输数据时(如果不知道数据比特是0还是1),如果对该数据没有明确的定义,则使用Redundancy。 Redundancy相当于事先确定的正确答案,传送数据本身就属于问题,与问题一起传送。 因为答案已经知道(立即发现对应的比特比特是0还是1的传输错误)问题,Rx可以重新计算,如果得到的答案与答案不一致,就会成为问题,因此传输数据中出现了error。 在实际通信过程中,Rx从非有线网络接收数据时,无条件地进行一次错误校正,经过该处理,传输数据本身的错误概率将大大降低,并根据Redundancy一起检测错误,如果结果不一致,则存在错误。
纠错过程比错误检查过程更复杂。 因为如果检查错误,只能确认数据包是否存在错误,如果纠正错误,就要知道正确的数字和位置。 由多种编码项目组成。 宏观上可以分为Block Coding和Convolution Coding。 块编码将比特流分为块,将多少比特视为一个单位,可以周期性地切断比特流,生成多个数据块,如果添加,则添加到块末端,根据当前数据决定剩余值。 相反,Convolution Coding是以前面已经传送的数据为基础,生成当前数据的Redundancy,Redundancy是根据之前传送的数据决定的。 块编码的性能比想象中要好,综合表现来看,Convolution虽然性能出色,但复杂度也很高。 目前,Block coding被广泛用于纠错,Convolution被广泛用于纠错。 当然,他们本身的功能也支持用于商用以外的领域。
Cyclic codes-CRC(Cyclic Redundancy Check)在单一错误、两个错误、奇数错误及burst errors[数据块错误]中具有非常好的性能。 它们容易在硬件和软件中体现,特别是在硬件中体现快,因此适用于循环代码较多的网络。 在CRC中存在无法抓住的错误。 当存在去除错误多项式的数或超过x^1的余数时,不能检测出错误。 这是为了使用散列函数在通信阶段探测数据的紧急变化而设计的。CRC主要适用于数据链接层(1,2阶层),Checksome主要适用于网络层(3,4阶层)。 我们要传送的比特流以块为单位分割,每个块的大小都一样。 每个数据都叫m bits,我们把这次传送的数据块弄成一个值,然后添加相同尺寸的数据块。 该数据块与前有效数据块的二进制数字矢量相反。 即,所有mbit的数据块求和的数据的绝对值与我们要添加的数据块的绝对值相同,并且它们之间是相反的。 这样,Rx在收到数据块后,将最后数据与前述所有数据的和值相匹配,如果获得0,则视为在传输阶段没有错误,否则就视为传输错误。
小节
概括起来,哈希函数可以分为密码学和非密码学的哈希函数。 其中最大的不同点是碰撞抵抗性。 碰撞抵抗性强的哈希函数是密码学上的哈希函数,具有强烈的单向性、碰撞抵抗性和压缩性能。 碰撞抵抗性不那么强的哈希函数主要用于有效搜索某些数据。 解密是利用密码学解密函数的特性,在服务器方面验证密码的机制。 这种机制的优势在于,即使映射服务器中存储的密码的哈希值暴露出来,也几乎不会妨碍用户。 因为,根据哈希函数的单向性,即使有哈希值,也不可能反过来获得相应的输入值。 KDF的密钥衍生算法(更慢的哈希算法)用于将初始密钥转换为增强密钥,并且在计算过程中延长时间或消耗空间,因此对保护弱密码很有用。 即密码解示和KDF是利用解示函数的示例。
和通信中的差错校验、校验和等,主要是网络立场上通信过程中使用的用语。 通信时,接收器接收数据链路层的数据,检查相应数据是否正常是错误检测代码,并且错误在哪里需要修改到什么程度才是错误校正代码。 校验和也有探测错误的作用,主要用于网络、传输阶层。 作为这种功能的基础构成要素之一的Redundancy是利用哈希函数生成的随机数列的情况较多。 其目的是,当攻击者随意改变消息时,快速检测到消息,而不是由于一般通信错误。