mac   : shasum -a 256 <文件名>
linux : sha256sum <文件名>

sha256哈希运算

//sha256运算后,得到256位的哈希数值, 使用16进制打印如下:
46a546cfdc716cd3d7e49795a3b77428470778126b2b0e004932adb7844a5a54

64 * 4 = 256bit

特性:

Hash: 可以对输入的数据内容生成一个唯一的数值
对于同一个算法,有如下特性:
1. 输入内容不变,输出内容不变
2. 输入内容改变,哪怕是一点点改变,输出的内容千差万别
3. 无论输入的内容大小如何,(1M, 1K, 1G), 生成的哈希长度相同
4. 哈希运算是对输入内容做摘要(指纹),无法根据哈希值反推会原文。

输入:原像
输出:摘要,指纹,哈希值
算法:哈希函数,摘要函数,消息摘要函数,杂凑函数

– 根据任意长度的消息计算出固定长度的散列值
– 能够快速计算出散列值
– 消息不同散列值也不同

重要特性:

1、原像不可逆:
具备单向性, 1k => 10G内容, 不可能

2、抗碰撞性:
2^256 可能 =》全宇宙可观测原子总数
给一个哈希值:46a546cfdc716cd3d7e49795a3b77428470778126b2b0e004932adb7844a5a54
你去拼装一段内容,使得运行同样的算法,同样的哈希值。不可能完成的

哈希应用

1. 检测软件是否被篡改


2. 消息认证码

使用单向散列函数可以构造消息认证码。
消息认证码是将“发送者和接收者之间的共享密钥”和“消息,进行混合后计算出的散列值。使用消息认证码可以检测并防止通信过程中的错误、篡改以及伪装。

3. 伪随机数生成器

使用单向散列函数可以构造伪随机数生成器。
密码技术中所使用的随机数需要具备“事实上不可能根据过去的随机数列预测未来的随机数列”这样的性质。为了保证不可预测性,可以利用单向散列函数的单向性。

4. 一次性口令
使用单向散列函数可以构造一次性口令(one-time password)。
一次性口令经常被用于服务器对客户端的合法性认证。在这种方式中,通过使用单向散列函数可以保证口令只在通信链路上传送一次(one-time),因此即使窃听者窃取了口令,也无法使用。

5. 密码存储

网站数据库中,对密码的存储并不是密码的明文,而是密码的哈希值,
每次登录时,会对密码进行哈希处理,然后与数据库对比。
即使数据库被盗,黑客也无法拿到用户的密码,保证用户账户安全

6. 数字签名
私钥对文件签名时,并不会对文件本身做签名,而是对这个文件的哈希值进行签名

在进行数字签名时也会使用单向散列函数。
数字签名是现实社会中的签名(sign)和盖章这样的行为在数字世界中的实现。数字签名的处理过程非常耗时,因此一般不会对整个消息内容直接施加数字签名,而是先通过单向散列函数计算出消息的散列值,然后再对这个散列值施加数字签名。