Hash,一般翻译做散列,或音译为哈希,是把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。
逆的。
Hash函数拥有无限的输入空间,却只有有限的输出空间,这意味着Hash函数一定会产生碰撞,一个好的Hash函数可以显著的降低碰撞概率。Hash函数一般有一下特征:
一致性
Hash函数可以接受任意大小的数据,并输出固定长度的散列值,同时输出不同值的概率应该尽可能一致。如CityHash128,不管原始数据有多大,计算得到的hash值总是128 bit。
单向
只能从原始数据计算得到hash值,不能从hash值计算得到原始数据。所以散列算法不是加密解密算法,加密解密是可逆的,散列算法是不可逆的。
避免冲突。几乎不可能找到一个数据和当前计算的这个数据计算出一样的hash值,因此散列函数能够确保数据的唯一性。在Hash函数保证不同值出现的概率一致的情况下,CityHash128出现碰撞的概率只有2^-128。因为不同Key的碰撞概率很小,所以在某些情况下我们可以直接使用较短的Hash值代替较长原始数据存储。
SHA是一个密码散列函数家族,SHA算法主要分为安全哈希算法1(SHA-1)、安全哈希算法2(SHA-2)和安全哈希算法3(SHA-3)三大类,一般使用SHA-2算法,主要有SHA-256、SHA-512、SHA-224、SHA-384四种,对于嵌入式一般选择SHA256,将任意长度的输入压缩成256位,且哈希碰撞的概率近乎为0。
Secure Hash Algorithm 1(SHA-1)是一种哈希函数,它采用随机长度输入并生成称为消息摘要的160位(20字节)哈希值,通常表示为40个十六进制数字。美国国家安全局于1995年设计了该算法,但此后哈希函数已被破坏并被更安全的协议所取代。
SHA-1通过将输入分成“n”个部分来转换用户数据;每个大小为448位,然后加上64位填充,总共512位。这512位通过压缩函数发送,该函数输出最终的160位哈希值。
Secure Hash Algorithm(SHA-2)是一系列加密哈希函数,包括SHA-224、SHA-256、SHA-384和SHA-512。与SHA-1一样,SHA-2由美国国家安全局(NSA)设计的,被广泛用于各种安全协议和应用中。
SHA-2使用与SHA-1相同的基本结构,但具有更长的输入和输出块大小,这使得它更安全,可以抵御暴力攻击。SHA-224和SHA-256有32位字节,而SHA-384和SHA-512有64位字节。
SHA-2的工作原理是将输入消息分成固定大小的块,然后使用一系列数学运算处理每个块。每个块的处理涉及到一系列逻辑函数,如AND、OR、XOR,以及模块化加法和位元旋转操作。
SHA-2算法的核心是压缩函数,它采用消息块和一组称为消息调度的变量,并更新变量以产生新的哈希值。重复此压缩函数,直到处理完所有消息块,此时生成最终哈希值。
SHA-2被广泛认为是一种安全且强大的加密哈希函数,并用于各种应用程序,例如区块链中的数字签名(SHA-256)、SSL/TLS和文件完整性检查。然而,许多安全研究人员认为,世界迟早会从SHA-256迁移到SHA-512,以确保更高的安全性。