HSAH
Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值。
简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数
Hash的特点
•算法是公开的
•对相同数据运算,得到的结果是一样的
•对不同数据运算,如MD5得到的结果默认是128位,32个字符(16进制标识)。
•这玩意没法逆运算(32个字符所能表达的数据是不定长的,散列碰撞)
•信息摘要,信息“指纹”,是用来做数据识别的。
加密方式
非对称加密 : RSA
对称加密 : DES 、 3DES 、AES
HASH: MD5 、 SHA1 / SHA256
用途
•用户密码的加密
•搜索引擎
•版权 (相似的文件的hash值不同,可视为正版盗版的一个判定依据,同个文件改文件名或类型或copy后,hash值并不发生改变,只有改变二进制排列才会产生变化)
•数字签名
HASH加密方式:
1.加盐 坏处:盐一旦泄露 就不安全了,盐是写死的。
2.HMAC加密方案
使用一个密钥加密,并且做了两次散列, 在实际开发中,密钥来自于服务器
- (NSString*)hmacMD5StringWithKey:(NSString*)key {}
例如用户注册登录:
注册时先把账号发给服务器匹配账号是否可以使用,可以使用后随机生成key密钥,然后将密钥发给客户端,客户端拿到key值后再进行HMAC加密,加密之后得到的HASH值发给服务器。
如果换了设备登录的话,就找服务器要对应账号的key,输入密码用key进行HMAC加密,然后将加密的结果发给服务器验证,验证成功后登录成功,将key保存在本地,没有登录成功将key删除。
加一步:如果设备开启了授权设备锁,那么向服务器索要key的时候会向已授权设备发送验证, 授权设备允许后将key给与新的设备。
漏洞:不需要获得用户的真实密码,直接将加密后的md5值发送给服务器,一样可以登录。
HMAC
升级后HMAC加密:
在生成的 HMAC哈希值 的后面添加一个当前时间的字符串(可能是当前的年月日时分),在求一次md5,然后发送给服务器,服务器验证 HMAC哈希值 加上当前的时间的字符串(有时加上上一分钟的字符创)进行md5运算,这样这个值的有效期在1分钟到1分钟59秒之间。
这样的好处是每次加密的结果都不一样,这个时间戳是服务器给的。
密码加密方式
•直接使用MD5
•MD5加盐
•HMAC加密方案
•添点东西
源代码
#define CC_MD5_DIGEST_LENGTH 16 /* digest length in bytes */ 16个字节,16*8 = 128位的二进制
constchar*str =self.UTF8String;//加密数据的指针
uint8_t buffer[CC_MD5_DIGEST_LENGTH];//加密数据的长度,
CC_MD5(str, (CC_LONG)strlen(str), buffer);、
return [self stringFromBytes:buffer length:CC_MD5_DIGEST_LENGTH];
数字签名
将原始数据的hash值用RSA进行加密,发给服务器的将是原始数据和用RSA加密后的hash值,然后服务器解密,对比原始数据进行相同算法的hash值,如果匹配说明数据没有被修改过,这就叫做数字签名。
代码签名
对称加密
对称加密方式:明文通过密钥加密得到密文。密文通过密钥解密得到明文。
常见算法
•DES 数据加密标准(用得少,因为强度不够)
•3DES 使用3个密钥,对相同的数据执行3次加密,强度增强
•AES 高级密码标准。(钥匙串访问)
应用模式
•ECB(Electronic Code Book):电子密码本模式。每一块数据,独立加密。
•最基本的加密模式,也就是通常理解的加密,相同的明文将永远加密成相同的密文,无初始向量,容易受到密码本重放攻击,一般情况下很少用。
•CBC(Cipher Block Chaining):密码分组链接模式。使用一个密钥和一个初始化向量[IV]对数据执行加密。加密解密都会依赖前一块数据。(防窃听的技术)
•明文被加密前要与前面的密文进行异或运算后再加密,因此只要选择不同的初始向量,相同的密文加密后会形成不同的密文,这是目前应用最广泛的模式。CBC加密后的密文是上下文相关的,但明文的错误不会传递到后续分组,但如果一个分组丢失,后面的分组将全部作废(同步错误)。
•CBC可以有效的保证密文的完整性,如果一个数据块在传递是丢失或改变,后面的数据将无法正常解密。
$ openssl enc -des-ecb -k -616263 -nosalt -in message.txt -out msg1.bin (用ecb进行加密)
$ openssl enc -des-cbc -iv 0102030405060708 -k 616263 -nosalt -in message.txt -out msg4.bin (用cbc进行加密)
xxd msg1.bin (查看)
- k 616263 传递的就是二进制 (abc)
OpenSSL
终端命令:
•加密:
•AES(ECB)加密“hello”字符串
$ echo -n hello | openssl enc -aes-128-ecb -K 616263 -nosalt | base64
•AES(CBC)加密“hello”字符串
$ echo -n hello | openssl enc -aes-128-cbc -K 616263 -nosalt -iv 0102030405060708 | base64
•解密:
•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 -K 616263 -iv 0102030405060708 -nosalt -d
代码
需要导入 EncryptionTools.h
iv (初始化向量)有值就是cbc, 无值就是ecb,返回的结果是个base的字符串
加密解密都是它 -- CCCrypt 参数说明
CCCrypt(<#CCOperation op#>, <#CCAlgorithm alg#>, <#CCOptions options#>, <#const void *key#>, <#size_t keyLength#>, <#const void *iv#>, <#const void *dataIn#>, <#size_t dataInLength#>, <#void *dataOut#>, <#size_t dataOutAvailable#>, <#size_t *dataOutMoved#>)
1、kCCEncrypt 加密/kCCDecrypt 解密
2、加密算法。
3、加密选项:ECB/CBC
4、加密的密钥
5、密钥的长度
6、iv 初始化向量
7、加密的数据
8、加密的数据长度
9、密文的内存地址
10、密文缓冲区的大小
11、加密结果大小
弊端:可以 symbolic 断点断住 CCCrypt 函数
函数调用的参数存在cpu的寄存器中
register read x6 (x6 是因为第7个参数是加密的数据)
p (char *)0x00000001c000ec20 (显示加密的数据)