一、Hash
- Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数
1.1 HASH的特点
- 算法是公开的
- 相同的数据结果相同
- 对不同数据运算,如MD5得到的结果默认是128位, 32个字符(16进制标识); 不同的数据长度相同
- 不可逆运算
- 信息摘要,信息 “指纹”,是用来做数据识别的(密码、版权、百度云数据识别)
1.2 HASH的用途
- 用户密码的加密
- 数字签名
- 搜索引擎
- 版权
1.2.1 、密码加密
通过运算HASH算法,给用户的密码进行加密
1.2.1.1 密码加密方式
- 直接使用MD5. 可以被反查询
- MD5加盐(固定的盐有安全隐患)
- HMAC加密方案: 用动态KEY来加密数据
- HASH+时间戳. 这样的方式,每次加密结果不一样(受时间的影响比较大)
1.2.2、数字签名
数字签名,就是用于鉴别数字信息的方法
- 算法: RSA + HASH
- 目的: 验证数据的完整性,不被篡改
- 逻辑:
- 1、数据报文(原始数据)的HASH值
- 2、使用RSA加密HASH值(这部分数据就是原始数据的签名信息)
- 3、将原始数据+数字签名一起打包发送传递
1.3 hash加解密终端命令使用
#pragma mark - 散列函数/*** 计算MD5散列结果* 终端测试命令:* @code* md5 -s "string"* @endcode* <p>提示:随着 MD5 碰撞生成器的出现,MD5 算法不应被用于任何软件完整性检查或代码签名的用途。<p>* @return 32个字符的MD5散列字符串*/
- (NSString *)md5String;/*** 计算SHA1散列结果* 终端测试命令:* @code* echo -n "string" | openssl sha -sha1* @endcode** @return 40个字符的SHA1散列字符串*/
- (NSString *)sha1String;/*** 计算SHA256散列结果* 终端测试命令:* @code* echo -n "string" | openssl sha -sha256* @endcode** @return 64个字符的SHA256散列字符串*/
- (NSString *)sha256String;/*** 计算SHA 512散列结果* 终端测试命令:* @code* echo -n "string" | openssl sha -sha512* @endcode** @return 128个字符的SHA 512散列字符串*/
- (NSString *)sha512String;#pragma mark - HMAC 散列函数/*** 计算HMAC MD5散列结果** 终端测试命令:* @code* echo -n "string" | openssl dgst -md5 -hmac "key"* @endcode** @return 32个字符的HMAC MD5散列字符串*/
- (NSString *)hmacMD5StringWithKey:(NSString *)key;/*** 计算HMAC SHA1散列结果** 终端测试命令:* @code* echo -n "string" | openssl sha -sha1 -hmac "key"* @endcode** @return 40个字符的HMAC SHA1散列字符串*/
- (NSString *)hmacSHA1StringWithKey:(NSString *)key;/*** 计算HMAC SHA256散列结果** 终端测试命令:* @code* echo -n "string" | openssl sha -sha256 -hmac "key"* @endcode** @return 64个字符的HMAC SHA256散列字符串*/
- (NSString *)hmacSHA256StringWithKey:(NSString *)key;/*** 计算HMAC SHA512散列结果** 终端测试命令:* @code* echo -n "string" | openssl sha -sha512 -hmac "key"* @endcode** @return 128个字符的HMAC SHA512散列字符串*/
- (NSString *)hmacSHA512StringWithKey:(NSString *)key;#pragma mark - 文件散列函数/*** 计算文件的MD5散列结果** 终端测试命令:* @code* md5 file.dat* @endcode** @return 32个字符的MD5散列字符串*/
- (NSString *)fileMD5Hash;/*** 计算文件的SHA1散列结果** 终端测试命令:* @code* openssl sha -sha1 file.dat* @endcode** @return 40个字符的SHA1散列字符串*/
- (NSString *)fileSHA1Hash;/*** 计算文件的SHA256散列结果** 终端测试命令:* @code* openssl sha -sha256 file.dat* @endcode** @return 64个字符的SHA256散列字符串*/
- (NSString *)fileSHA256Hash;/*** 计算文件的SHA512散列结果** 终端测试命令:* @code* openssl sha -sha512 file.dat* @endcode** @return 128个字符的SHA512散列字符串*/
- (NSString *)fileSHA512Hash;
二、对称加密
- 对称加密方式: 明文通过密钥加密得到密文. 密文通过密钥解密得到明文
2.1 对称加密常用算法
- DES: 数据加密标准(用得少,因为强度不够)
- 3DES: 使用3个密钥,对相同的数据执行3次加密,强度增加
- AES: 高级密码标准
- ECB(Electronic Code Book): 电子密码本模式.每一块数据,独立加密
- 最基本的加密模式,也就是通常理解的加密,相同的明文将永远加密成相同的密文,无初始向量,容易收到密码本重放攻击,一般情况下很少用.
- CBC(Cipher Block Chaining): 密码分组链接模式. 使用一个密钥和一个初始化向量[IV]对数据执行加密
- 明文被加密前要与前面的密文进行异或运算后再加密,因此只要选择不同的初始向量, 相同的密文加密后会形成不同的密文,这是目前应用最广泛的模式. CBC加密后的密文是上下文相关的,但明文的错误不会传递到后续分组,但如果一个分组丢失,后面的分组将全部作废(同步错误)
- CBC可以有效的保证密文的完整性, 如果一个数据块在传递时丢失或改变, 后面的数据将无法正常解密.
- ECB(Electronic Code Book): 电子密码本模式.每一块数据,独立加密
2.2 对称加密终端加解密测试指令
* * DES(ECB)加密* $ echo -n hello | openssl enc -des-ecb -K 616263 -nosalt | base64* DES(CBC)加密* $ echo -n hello | openssl enc -des-cbc -iv 0102030405060708 -K 616263 -nosalt | base64* AES(ECB)加密* $ echo -n hello | openssl enc -aes-128-ecb -K 616263 -nosalt | base64* AES(CBC)加密* $ echo -n hello | openssl enc -aes-128-cbc -iv 0102030405060708 -K 616263 -nosalt | base64* DES(ECB)解密* $ echo -n HQr0Oij2kbo= | base64 -D | openssl enc -des-ecb -K 616263 -nosalt -d* DES(CBC)解密* $ echo -n alvrvb3Gz88= | base64 -D | openssl enc -des-cbc -iv 0102030405060708 -K 616263 -nosalt -d* AES(ECB)解密* $ echo -n d1QG4T2tivoi0Kiu3NEmZQ== | base64 -D | openssl enc -aes-128-ecb -K 616263 -nosalt -d* AES(CBC)解密* $ echo -n u3W/N816uzFpcg6pZ+kbdg== | base64 -D | openssl enc -aes-128-cbc -iv 0102030405060708 -K 616263 -nosalt -d*