zoukankan      html  css  js  c++  java
  • iOS开发——高级篇——iOS开发之网络安全密码学

    一、非对称加密

      - 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的结果,后缀名只决定操作系统用什么工具打开

  • 相关阅读:
    hdu6229 Wandering Robots 2017沈阳区域赛M题 思维加map
    hdu6223 Infinite Fraction Path 2017沈阳区域赛G题 bfs加剪枝(好题)
    hdu6438 Buy and Resell 买卖物品 ccpc网络赛 贪心
    hdu6441 Find Integer 求勾股数 费马大定理
    bzoj 1176 Mokia
    luogu 3415 祭坛
    bzoj 1010 玩具装箱
    bzoj 3312 No Change
    luogu 3383【模板】线性筛素数
    bzoj 1067 降雨量
  • 原文地址:https://www.cnblogs.com/chglog/p/9413158.html
Copyright © 2011-2022 走看看