什么是数字签名
小苹果的签名机制
密码学深入理解 ---demo含全图
密码学是研究编制密码和破译密码的技术科学。研究密码变化的客观规律,应用于编制密码以保守通信秘密的,称为编码学;应用于破译密码以获取通信情报的,称为破译学,总称密码学。电报最早是由美国的摩尔斯在1844年发明的,故也被叫做摩尔斯电码。它由两种基本信号和不同的间隔时间组成:短促的点信号" .",读" 的 "(Di);保持一定时间的长信号"—",读"答 "(Da)。间隔时间:滴,1t;答,3t;滴答间,1t;字母间,3t;字间,5t。
密码学最早应用于军事领域,起源于公元前凯撒大帝时期。
恺撒大帝是古罗马共和国末期著名的统帅和政治家。虽然他一生从未登上过皇位,但是直到今天在西方国家,他的名字仍是君主的代名词。在他出征时,为了避免军令落入敌军手中而泄漏军情,他自己发明了一种单字替代密码。所谓"单字替代密码"就是把明文中的每个字母用密文中的对应字母替代,明文字符集与密文字符集是一一对应的关系——凯撒码。
持续到 上世纪70年代 ,70 年代出现了一个特别伟大的算法叫RSA(Ron Rivest、Adi Shamir、Leonard Adleman一起提出)
-
- 非对称加密算法
-
RSA - 加密算法!算法是公开的!
- 公钥加密,私钥解密
-
私钥加密,公钥解密
用因式分解破解密码,大概需要50年!! 有人为此著书<我和RSA的20年> -- 结果就是破解RSA 只能用因式分解
-
RSA - 加密算法!算法是公开的!
-
- 对称加密算法
- DES
- 3DES
-
AES(高级密码标准,美国国家安全局使用的,iOS系统使用的加密方式(钥匙串))
-
- 哈希(散列)函数
- MD5
- SHA1
- SHA256/512
-
散列函数:
-
特点:
- 算法公开的.
- 对相同的数据加密,得到的结果是一样的.
- 对不同的数据加密,得到的结果是定长的,MD5对不同的数据进行加密,得到的结果都是32个字符.
- 信息摘要,信息"指纹",是用来做数据识别的.
- 不能反算的.
-
MD5用途
密码,(服务器是不需要知道用户的真实密码的!在用户注册的时候服务器就对密码进行了加密处理,然后保存在数据库!)
搜索
版权
不同的数据 MD5 之后差别是非常大的!!
A.png 0e6c471b5849e7a10f1a6a3172034fff
B.png 0fea626f61419becf8005fdf942e668e
-
-
散列破解 比对破解:
- 目前破解散列函数,只有 MD5,SHA1也在边缘
- 散列碰撞,找出不同的数据使用MD5之后能够得到相同的结果!
(有可能吗?必须有可能!!) -- 36^32
MD5 的基本安全:
1.加"盐" - 早期使用!
2.HMAC,近一两年,在国内开始使用增多!
给定一个密钥,对明文进行密钥拼接,并且做"两次散列" -> 得到32位结果!-
HMAC :
- 用户在注册的那一刻,向服务器索取 密钥(key)!!
- 客户端拿到KEY的这一刻,就将KEY保存在本地!!
- 切换了新的设备(换手机登录,登录新的已有账号!) -- 重新找服务器获取!!
如何避免破解
一种情况! 如果黑客 模拟你的网络请求..不需要拿到真实密码!用加密后的信息,也可以获得登录之后的权限!!
让我们的密码具有时效性!! 也就是 加密过后的密码 有时间限制!!
客户端:
UserID = yochi
Pass == (123456+KEY)HMAC == e9cdab82d48dcd37af7734b6617357e6
KEY
发送:UserID : (Pass + '201702102020')md5
服务器:
KEY
UserID = hank
密码 = Pass == e9cdab82d48dcd37af7734b6617357e6
对比: 只要服务器当前时间或者上一分钟 加密后的字符相等!就返回登录成功!!
(Pass + '201702102020')md5 != (Pass + '201702102021')md5
(Pass + '201702102020')md5 == (Pass + '201702102020')md5
----------------------------- 保存在本地 ---------------------------
钥匙串访问:
- 苹果的"生态圈",从 iOS7.0.3 版本开放给开发者!
- 功能:在Mac上能够动态生成复杂密码,帮助用户记住密码!
- 如果用户访问网站,记住密码,我们还可以看到记住的密码明文!明文记录
- 本身的所有接口都是 C 语言的.借助三方库
- 采用的加密方式是 AES 加密!
iOS加密实战
//
// NSString+Hash.h
// 01-数据安全
//
// Created by h on 15/11/12.
// Copyright (c) 2015年 tanzhou. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface NSString (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;
@end
//
// RSACryptor.h
// 001--RSA
//
// Created by H on 2017/2/10.
// Copyright © 2017年 TZ. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface RSACryptor : NSObject
+ (instancetype)sharedRSACryptor;
/**
* 生成密钥对
*
* @param keySize 密钥尺寸,可选数值(512/1024/2048)
*/
- (void)generateKeyPair:(NSUInteger)keySize;
/**
* 加载公钥
*
* @param publicKeyPath 公钥路径
*
@code
# 生成证书
$ openssl genrsa -out ca.key 1024
# 创建证书请求
$ openssl req -new -key ca.key -out rsacert.csr
# 生成证书并签名
$ openssl x509 -req -days 3650 -in rsacert.csr -signkey ca.key -out rsacert.crt
# 转换格式
$ openssl x509 -outform der -in rsacert.crt -out rsacert.der
@endcode
*/
- (void)loadPublicKey:(NSString *)publicKeyPath;
/**
* 加载私钥
*
* @param privateKeyPath p12文件路径
* @param password p12文件密码
*
@code
openssl pkcs12 -export -out p.p12 -inkey ca.key -in rsacert.crt
@endcode
*/
- (void)loadPrivateKey:(NSString *)privateKeyPath password:(NSString *)password;
/**
* 加密数据
*
* @param plainData 明文数据
*
* @return 密文数据
*/
- (NSData *)encryptData:(NSData *)plainData;
/**
* 解密数据
*
* @param cipherData 密文数据
*
* @return 明文数据
*/
- (NSData *)decryptData:(NSData *)cipherData;
@end
//
// EncryptionTools.h
// 001--登录
//
// Created by H on 2017/2/10.
// Copyright © 2017年 TZ. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <CommonCrypto/CommonCrypto.h>
/**
* 终端测试指令
*
* 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
*
* 提示:
* 1> 加密过程是先加密,再base64编码
* 2> 解密过程是先base64解码,再解密
*/
@interface EncryptionTools : NSObject
+ (instancetype)sharedEncryptionTools;
/**
@constant kCCAlgorithmAES 高级加密标准,128位(默认)
@constant kCCAlgorithmDES 数据加密标准
*/
@property (nonatomic, assign) uint32_t algorithm;
/**
* 加密字符串并返回base64编码字符串
*
* @param string 要加密的字符串
* @param keyString 加密密钥
* @param iv 初始化向量(8个字节)
*
* @return 返回加密后的base64编码字符串
*/
- (NSString *)encryptString:(NSString *)string keyString:(NSString *)keyString iv:(NSData *)iv;
/**
* 解密字符串
*
* @param string 加密并base64编码后的字符串
* @param keyString 解密密钥
* @param iv 初始化向量(8个字节)
*
* @return 返回解密后的字符串
*/
- (NSString *)decryptString:(NSString *)string keyString:(NSString *)keyString iv:(NSData *)iv;
@end