iOS签名机制,梳理各种加密算法

什么是数字签名

数字签名

小苹果的签名机制

iOS签名机制

密码学深入理解 ---demo含全图

点击加号展开

密码学是研究编制密码和破译密码的技术科学。研究密码变化的客观规律,应用于编制密码以保守通信秘密的,称为编码学;应用于破译密码以获取通信情报的,称为破译学,总称密码学。电报最早是由美国的摩尔斯在1844年发明的,故也被叫做摩尔斯电码。它由两种基本信号和不同的间隔时间组成:短促的点信号" .",读" 的 "(Di);保持一定时间的长信号"—",读"答 "(Da)。间隔时间:滴,1t;答,3t;滴答间,1t;字母间,3t;字间,5t。

密码学最早应用于军事领域,起源于公元前凯撒大帝时期。
恺撒大帝是古罗马共和国末期著名的统帅和政治家。虽然他一生从未登上过皇位,但是直到今天在西方国家,他的名字仍是君主的代名词。在他出征时,为了避免军令落入敌军手中而泄漏军情,他自己发明了一种单字替代密码。所谓"单字替代密码"就是把明文中的每个字母用密文中的对应字母替代,明文字符集与密文字符集是一一对应的关系——凯撒码。

持续到 上世纪70年代 ,70 年代出现了一个特别伟大的算法叫RSA(Ron Rivest、Adi Shamir、Leonard Adleman一起提出)

  • - 非对称加密算法

    • RSA - 加密算法!算法是公开的!
      • 公钥加密,私钥解密
      • 私钥加密,公钥解密

        用因式分解破解密码,大概需要50年!! 有人为此著书<我和RSA的20年> -- 结果就是破解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

----------------------------- 保存在本地 ---------------------------
钥匙串访问:

  1. 苹果的"生态圈",从 iOS7.0.3 版本开放给开发者!
  2. 功能:在Mac上能够动态生成复杂密码,帮助用户记住密码!
  3. 如果用户访问网站,记住密码,我们还可以看到记住的密码明文!明文记录
  4. 本身的所有接口都是 C 语言的.借助三方库
  5. 采用的加密方式是 AES 加密!

iOS加密实战

iOS散列、非对称、对称demo下载


//
//  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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 这篇文章主要讲述在Mobile BI(移动商务智能)开发过程中,在网络通信、数据存储、登录验证这几个方面涉及的加密...
    雨_树阅读 2,798评论 0 6
  • 一、Base64 原理: base64的编码都是按字符串长度,以每3个8bit的字符为一组, 然后针对每组,首先获...
    谢谢生活阅读 4,873评论 7 33
  • 本文主要介绍移动端的加解密算法的分类、其优缺点特性及应用,帮助读者由浅入深地了解和选择加解密算法。文中会包含算法的...
    苹果粉阅读 11,617评论 5 29
  • 随着对于安全度的不断要求,对于数据加解密与破解之间的斗争,加解密的方式也在不断发生着变化,来看看现在流行的一些加解...
    zhouhao_180阅读 2,166评论 1 12
  • 时间真的很快,我的小汤圆已经7个多月了。小汤圆的名字还没达成一致,性别也不得而知。最近动的越来越频繁了,不时...
    Min_Xu阅读 308评论 0 0