一、HASH概述
Hash
一般翻译做“散列”,也直接音译为“哈希”,就是把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要(指纹)的函数。
- MD5
- SHA1、256、512
HASH特点
- 算法是公开的
- 对相同数据运算得到的结果是一样的
- 对不同数据运算,如
MD5
得到的结果默认是128
位,32
个字符(16
进制标识)。 - 无法逆运算。(无法做加密)
- 信息摘要,信息 指纹,用来做数据识别。
为什么无法逆运算?
比如对数据进行MD5
运算得到的结果是128
位,也就是能表达的数据是1632种(有限),那么由于数据(无限)。这里必然有多个数据拥有同样的hash
值(散列碰撞)。
二、HASH用途
- 用户密码的加密 密码加密
- 搜索引擎
比如:iOS Swift
和Swift iOS
搜索出来的结果可能相同。这里词有hash
值,将多个词的hash
值拿到加到一起。 - 版权
任意文件都会生成一个hash
值。上传平台后平台会保存原始文件hash
值。别人下载的文件不是原文件(平台生成)。这个时候平台就可以通过原文件hash
来区分确定版权问题了。 - 网盘
数据识别-hash
- 数字签名
三、数字签名
因为国外喜欢用支票,支票上面的签名能够证明身份。数字签名顾名思义,就是用于鉴别数字信息的方法。确认二进制是不是原始机构签发的。
1.对二进制计算
hash
值。2.签发方对
hash
值进行rsa
加密。3.接收方解密获取
hash
值并且对二进制文件计算hash
值,hash
值相同则证明是原始文件。
在这里对hash
值进行rsa
加密后的数据就叫做这个二进制文件的数字签名。
四、hash终端
HASH
md5
// 字符串
md5 -s "HotpotCat"
//文件
md5 message.txt
计算MD5
散列结果,返回32
个字符的MD5
散列字符串:
a3c28fbab2813ebc16d8b89af683e696
b15dee09737df6c4a23079148ff64172
sha1
//字符串
echo -n "HotpotCat" | openssl sha1
//文件
openssl sha1 message.txt
计算SHA1
散列结果,返回40
个字符的SHA1
散列字符串:
108e0108a568820fe1fa71038091a0f4d753f5b2
ccc9cd754ec0708ae43b83813adb4b10895d67a1
sha256
//字符串
echo -n "HotpotCat" | openssl sha256
//文件
openssl sha256 message.txt
计算SHA256
散列结果,返回64
个字符的SHA256
散列字符串:
cc49e970f712386a382c990bd5670298eb1bf5167e85b3d95b9c394394eda7ce
fbabb42485e50ebb8bbaf200841cfebd21bfbe7e44e28a8068dff888b6952a3a
sha512
//字符串
echo -n "HotpotCat" | openssl sha512
//文件
openssl sha512 message.txt
计算SHA 512
散列结果,返回128
个字符的SHA 512
散列字符串:
7672238bfe9cd9ccc37bfab26052fb96cf9e43df8b21fc906ea9fcb79e26d0aed059cee305295e874a674e5f1dc15a1f2e76101c11a98ae48a6ace5ad6de0f8e
587d4c39b3e1005a6a950eabe974ae519a0589197fe186a9a656898dc32ea957d52c306ddface8f917b5e773f0e14bc7f487a3c2a0ff5e536ae407d02fe0ce4c
HMAC
HMAC md5
echo -n "HotpotCat" | openssl dgst -md5 -hmac "key"
计算HMAC MD5
散列结果,返回32
个字符的HMAC MD5
散列字符串:
9374e4e9c7bbe8e18cef29fafd76f9e6
HMAC SHA1
echo -n "HotpotCat" | openssl sha1 -hmac "key"
计算HMAC SHA1
散列结果,返回40
个字符的HMAC SHA1
散列字符串:
c6e00dfd90223967caa9c706e356a493c02f33b8
HMAC SHA256
echo -n "HotpotCat" | openssl sha256 -hmac "key"
计算HMAC SHA256
散列结果,返回64
个字符的HMAC SHA256
散列字符串:
16c67f0640105490197c5c7f5ca9a9412e494eaebc541e47c1cf1e01499350c8
HMAC SHA512
echo -n "HotpotCat" | openssl sha512 -hmac "key"
计算HMAC SHA512
散列结果,返回128
个字符的HMAC SHA512
散列字符串:
246a301b3324cded0d44bbb1f036dc2c5580fbefc6d6ddf05ac06a262604bc738b5200ed42efa05c941bc2cd29b122b00ebe28065fdd9d95c7122579bd9b8dfb
五、hash代码
iOS
中加密解密框架是CommonCrypto
。
//string
NSString *message = @"HotpotCat";
NSString *key = @"key";
NSLog(@"string md5: %@",[message md5String]);
NSLog(@"string sha1: %@",[message sha1String]);
NSLog(@"string sha256: %@",[message sha256String]);
NSLog(@"string sha512: %@",[message sha512String]);
NSLog(@"string hmac md5: %@",[message hmacMD5StringWithKey:key]);
NSLog(@"string hmac sha1: %@",[message hmacSHA1StringWithKey:key]);
NSLog(@"string hmac sha256: %@",[message hmacSHA256StringWithKey:key]);
NSLog(@"string hmac sha512: %@",[message hmacSHA512StringWithKey:key]);
//文件
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"message" ofType:@"txt"];
NSLog(@"file md5: %@",[filePath fileMD5Hash]);
NSLog(@"file sha1: %@",[filePath fileSHA1Hash]);
NSLog(@"file sha256: %@",[filePath fileSHA256Hash]);
NSLog(@"file sha512: %@",[filePath fileSHA512Hash]);
输出:
string md5: a3c28fbab2813ebc16d8b89af683e696
string sha1: 108e0108a568820fe1fa71038091a0f4d753f5b2
string sha256: cc49e970f712386a382c990bd5670298eb1bf5167e85b3d95b9c394394eda7ce
string sha512: 7672238bfe9cd9ccc37bfab26052fb96cf9e43df8b21fc906ea9fcb79e26d0aed059cee305295e874a674e5f1dc15a1f2e76101c11a98ae48a6ace5ad6de0f8e
string hmac md5: 9374e4e9c7bbe8e18cef29fafd76f9e6
string hmac sha1: c6e00dfd90223967caa9c706e356a493c02f33b8
string hmac sha256: 16c67f0640105490197c5c7f5ca9a9412e494eaebc541e47c1cf1e01499350c8
string hmac sha512: 246a301b3324cded0d44bbb1f036dc2c5580fbefc6d6ddf05ac06a262604bc738b5200ed42efa05c941bc2cd29b122b00ebe28065fdd9d95c7122579bd9b8dfb
file md5: b15dee09737df6c4a23079148ff64172
file sha1: ccc9cd754ec0708ae43b83813adb4b10895d67a1
file sha256: fbabb42485e50ebb8bbaf200841cfebd21bfbe7e44e28a8068dff888b6952a3a
file sha512: 587d4c39b3e1005a6a950eabe974ae519a0589197fe186a9a656898dc32ea957d52c306ddface8f917b5e773f0e14bc7f487a3c2a0ff5e536ae407d02fe0ce4c
总结
- HASH
- 特点:
算法公开
不可逆运算(多对一)
相同数据加密结果相同
不同数据加密结果定长
一般用于数据的识别(密码,版权,网盘) - HASH用途:
- 密码加密
MD5直接加密,可以被反查询
加盐(固定盐有安全隐患)
HMAC加密方案:通过动态key加密数据
HMAC+时间戳: 加入时间变量保证每次加密结果受时间影响
- 密码加密
- 数字签名
算法:HASH+RSA
目的:验证数据的完整性不被篡改
逻辑:
1.原始数据进行Hash
2.使用RSA机密HASH值(这部分数据就是原始数据的数字签名)
3.将原始数据+数字签名一起发送传递(客户端使用公钥解密验证)
- 特点:
网友评论