一、非对称加密

  - RSA :

    + 公钥加密,私钥解密;

    + 私钥加密,公钥解密;

    + 只能通过因式分解来破解

二、对称加密

  - DES

  - 3DES

  - AES (高级密码标准,美国国家安全局使用,iOS操作系统内部使用,目前还没有发现过被破解的案例)

三、哈希散列函数 (摘要算法)

  1、常见算法  

    - MD5

    - SHA1

    - SHA256/512

  2、散列函数特点

    - 算法是公开的

    - 对相同的数据加密,得到的结果是一样的

    - 对不同的数据加密,得到的结果是一样长的32位字符 由a-Z 0-9 组成

    - 信息摘要,信息指纹,是用来做识别的,不能反算

  

四、iOS开发两条原则

1、不允许在网络上传递明文的用户隐私信息

  解决方案:

  * 各种加密算法(MD5  AES..........),但是有些算法并不安全,像MD5算法在网上随便找个网站都可以轻松的反加密破解掉 ,以下提供两种安全策略:

    - 加盐

      + 所谓的“盐”,其实可以理解为一串又臭又长的字符串,例如:UYGUYF&**%&**^*(&%&%&^TUGUYRFG^&R^&F^%^R$%ERFV^&VB&^R%^V

      + 客户端用用户的原始密码拼接盐再MD5得到的一串32位字符串发给服务端,服务端也用相同的算法得到字符串来对比结果

      + 盐要足够长,无规则,这样才不容易被破解,盐一般都是写死在本地,对于移动开发来说 只有iOS  安卓  服务器 三个人知道

      + 隐患一: 其实加盐已经算比较安全了,但是假如某天安卓的那哥们嫌自己的工资太低,找老板想要涨工资,老板没批,安卓那哥们直接辞职,并把加密算法和盐通通公布出去,那么GG

      + 隐患二: 换“盐”很麻烦(除非强制升级),所以一旦盐被泄漏了,对公司来说是灾难性的打击!这种角度来说加盐并不安全。

    - HMAC

      + 客户端发出登录请求,服务器返回一个随机值KEY(这里的KEY就是秘钥,也就是说每个账号的KEY都不一样),客户端和服务器均保存这个随机值KEY至本地 

      + 客户端将该随机值KEY和用户的密码进行 hmac 运算,递交给服务器,服务器保存这个值( (KEY+密码)HMAC  ),至此,注册已完成

      + 登录:获取本地的密钥 KEY,(KEY+密码)HMAC发送至服务器,服务器取出保存的值判断密码是否匹配

      + 好处:登录的过程中,黑客截获了我们发送的数据,他也只能得到 hmac 加密过后的结果,拿不到KEY,反加密不出密码,就算是拿到了KEY,也只能破解这一个用户的密码,甚至连服务器也不知道真正的密码,从而保证了安全性

      + 场景:QQ的设备锁,换了设备之后本地拿不到KEY,只能去服务器申请授权,授权成功之后,服务器返回KEY   

      + 隐患:黑客如果知道账号,又截取了密码密文,就能模仿用户登陆,获取权限,所以也不是绝对安全的     

    - HMAC 高端玩法

      + 登录:获取本地的密钥 KEY,(KEY+密码)HMAC+“时间戳精确到分” ,例如:(KEY+密码)HMAC+“201808031543”   发送至服务器

      + 服务器判断,取出保存的值(KEY+密码)HMAC,拼接“201808031544”,与客户端发来的做匹配,若不对,再用  (KEY+密码)HMAC+“201808031543”做匹配

      + 好处:加密后的密文是变化的,黑客拿到密文后在两分钟之内才有效,从而保证了安全性

2、在本地不允许明文的保存用户隐私信息

  解决方案:

    - 保存密文至程序本地,反算回明文后加载进内存 (麻烦)

    - 钥匙串(iOS开发者的福音)

      + 苹果“生态圈”,从iOS7.0.3版本开始,苹果开放给开发者访问!

      + 钥匙串加密方式就是AES加密,可以将保存的密码以明文的方式反算给你

      + 钥匙串苹果原生都是c语言的接口,代码又臭又长,但有三方框架,推荐 SSkeyChain

      + 用到的参数就三个:账号----密码-----包名(Bundle identifier)

  

  以下就是SSkeyChain的所有接口,简单易用:

+ (NSArray *)allAccounts;
+ (NSArray *)accountsForService:(NSString *)serviceName;
+ (NSString *)passwordForService:(NSString *)serviceName account:(NSString *)account;
+ (BOOL)deletePasswordForService:(NSString *)serviceName account:(NSString *)account;
+ (BOOL)setPassword:(NSString *)password forService:(NSString *)serviceName account:(NSString *)account;

注意xcode要打开下面这个开关:

五、MD5其他用法

1、搜索

场景:在百度搜索三个关键字: “深圳” “福田” “喜年支行”

    打乱关键字顺序: “福田” “喜年支行” “深圳” 

     搜索出的结果是一样的

    原理(方案):将三个关键字转为MD5字符串后 按位相加结果一样

2、版权问题

  - 图片MD5后是一串固定的字符串,只要是原图,MD5之后都是一样的

  - 如果是复制的也一样

  - ps过的图片MD5与原图的MD5是不一样的,文件、视频同理

  - 文件的后缀名不会影响MD5的结果,后缀名只决定操作系统用什么工具打开

iOS开发——高级篇——iOS开发之网络安全密码学的更多相关文章

  1. iOS开发——高级篇——iOS中如何选择delegate、通知、KVO(以及三者的区别)

      在开发IOS应用的时候,我们会经常遇到一个常见的问题:在不过分耦合的前提下,controllers[B]怎么进行通信.在IOS应用不断的出现三种模式来实现这种通信:1委托delegation2通知 ...

  2. iOS开发——高级篇——iPad开发、iPad开发中的modal

    一.iPad简介 1.什么是iPad一款苹果公司于2010年发布的平板电脑定位介于苹果的智能手机iPhone和笔记本电脑产品之间跟iPhone一样,搭载的是iOS操作系统 2.iPhone和iPadi ...

  3. iOS开发——高级篇——iOS 项目的目录结构

    最近闲来无事去面试一下iOS开发,让我感到吃惊的,面试官竟然问怎么分目录结构,还具体问每个子目录的文件名. 目录结构确实非常重要,面试官这么问,无疑是想窥探开发经验.清晰的目录结构,可让人一眼明白相应 ...

  4. iOS开发——高级篇——iOS 强制退出程序APP代码

    1.先po代码 UIAlertView* alert = [[UIAlertView alloc] initWithTitle:self.exitapplication message:@" ...

  5. iOS开发——高级篇——iOS中常见的设计模式(MVC/单例/委托/观察者)

    关于设计模式这个问题,在网上也找过一些资料,下面是我自己总结的,分享给大家 如果你刚接触设计模式,我们有好消息告诉你!首先,多亏了Cocoa的构建方式,你已经使用了许多的设计模式以及被鼓励的最佳实践. ...

  6. iOS开发——高级篇——iOS中为什么block用copy属性

    1. Block的声明和线程安全Block属性的声明,首先需要用copy修饰符,因为只有copy后的Block才会在堆中,栈中的Block的生命周期是和栈绑定的,可以参考之前的文章(iOS: 非ARC ...

  7. iOS开发——高级篇——iOS键盘的相关设置(UITextfield)

    一.键盘风格 UIKit框架支持8种风格键盘. typedef enum { UIKeyboardTypeDefault, // 默认键盘:支持所有字符 UIKeyboardTypeASCIICapa ...

  8. iOS开发——高级篇——iOS 中的 NSTimer

    以前的老代码在使用 NSTimer 时出现了内存泄露 NSTimer fire 我们先用 NSTimer 来做个简单的计时器,每隔5秒钟在控制台输出 Fire .比较想当然的做法是这样的: 1 2 3 ...

  9. iOS开发——高级篇——iOS涂鸦画板效果实现

    一个简单的绘图应用,模仿苹果自带软件备忘录里的涂鸦功能 核心代码 #import "DrawView.h" #import "DrawPath.h" @inte ...

随机推荐

  1. oslo.messaging

    oslo.messaging oslo.messaging库为OpenStack各个项目使用RPC和事件通知(Event Notification)提供了一套统一的接口.代码库位于https://gi ...

  2. ps----像素与分辨率

    1.为了用于印刷,所以调整文档尺寸也很重要. 2.像素的多少决定了文件的大小,像素越多图像越清晰越逼真. 3.文档的尺寸改变需要结合分辨率. 4.像素固定的情况下修改分辨率高度宽度也会变化. 5.画面 ...

  3. mysql优化之参数优化(转)

    1.优化方式 硬件优化=>系统优化=>mysql配置优化=>SCHEMA优化=>sql优化=>其他解决方案(redis or MongoDB or Cassandra o ...

  4. NBUT 1651 - Red packet (求运气王的钱数)(二分法)

    Description New Year is coming! Our big boss Wine93 will distribute some “Red Package”, just like Al ...

  5. 【HDU 2028】Lowest Common Multiple Plus

    Problem Description 求n个数的最小公倍数. Input 输入包含多个测试实例,每个测试实例的开始是一个正整数n,然后是n个正整数. Output 为每组测试数据输出它们的最小公倍数 ...

  6. 3D地形中的道路模拟

    笔者注: 这篇文章是我本人在2009年发表在cppblog的一篇技术文章,由于我的技术博客迁移至博客园,所以转载到了此,非盗文. 以下是正文: 前段时间被项目组长委派实现基于3D地形的道路系统.实现的 ...

  7. Leetcode 241.为运算表达式设计优先级

    为运算表达式设计优先级 给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果.你需要给出所有可能的组合的结果.有效的运算符号包含 +, - 以及 * . 示例 1: 输 ...

  8. Python的3种格式化字符串方法

    Python中有3种format字符串的方式: 传统C语言式 命名参数 位置参数 1. 传统C语言式 和c语言里面的 sprintf 类似,参数格式也一样 title = "world&qu ...

  9. Codeforces Round #211 (Div. 2)-D. Renting Bikes,二分!感谢队友出思路!

    D. Renting Bikes 读懂题后一开始和队友都以为是贪心.可是贪心又怎么贪呢..我们无法确定到底能买多少车但肯定是最便宜的前x辆.除了公共预算每个人的钱只能自己用,也无法确定每个人买哪一辆车 ...

  10. [luoguP1360] [USACO07MAR]黄金阵容均衡Gold Balanced L…

    传送门 真的骚的一个题,看了半天只会个前缀和+暴力.. 纯考思维.. 良心题解 #include <cstdio> #include <cstring> #include &l ...