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

  • 相关阅读:
    网络连接 长连接 短链接
    提升系统的QPS和吞吐量
    QPS/TPS/并发量/系统吞吐量的概念
    spring与mybatis四种整合方法
    理解HTTP之keep-alive
    MyBatis 3 使用注解配置SQL映射器
    Dubbo -- Simple Monitor
    Dubbo后台管理和监控中心部署
    Socket通讯-Netty框架实现Java通讯
    Netty 能做什么
  • 原文地址:https://www.cnblogs.com/chglog/p/9413158.html
Copyright © 2011-2022 走看看