从这篇记录开始,记录的都算是干货了,都是一些编程日常的积累。

我建议先将基础的工具加入项目,后续的开发效率会呈指数增长。如果在专注功能开发过程中,才发现缺少大量常用的工具,不仅会打断思路,还会拖慢开发节奏。

当然,在每个项目开始的时候,不可能将全部工具都准备充分,只能依据个人的经验来评估需要提前准备的工具。

一个好的工匠,必须要有一个好的工具箱,并且还要不断优化它。

稍微扩展一下项目架构。

1.在base目录下为项目增加“Utilities”文件夹作为工具箱,并创建“Utilities.h”头文件,在PrefixHeader.pch中引用该头文件

2.暂时先创建三个NSObject子类“StringHelper”,“ImageHelper”,“EncryptionHelper”,作为三个工具类,并加入Utilities.h的引用列表

3.在base目录下再增加两个结构“Categories”和“Libraries”,分别用于存放分类和类库

4.我进一步将类库分为了第三方类库和自创建类库

加密工具类EncryptionHelper

暂时记录了base64编码和解码,MD2、MD4、MD5、SHA1、SHA224、SHA256、SHA384、SHA512加密,AES、DES加密和解密。

1.base64编码和解码

 因为使用了Google的GTMBase64类库,所以讲此类库加入第三方库目录。

 此类库代码中使用了autorelease将对象加入自动释放池,在ARC的项目中,可以将用到此类代码清除。

 也可以在项目Target ->Build Phases ->Compile Sources,找到GTMBase64.m,双击后,在右边输入框内输入-fno-objc-arc,将此文件移除ARC管理。

 在EncryptionHelper.m中引用GTMBase64.h后,可以实现如下方法:

+ (NSString *)base64EncodeWithString:(NSString *)string
{NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];NSString *result = [GTMBase64 stringByEncodingData:data];return result;
}+ (NSString *)decodeBase64WithString:(NSString *)string
{NSData *data = [GTMBase64 decodeString:string];NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];return result;
}

2.MD5加密

 因为不可逆(大概可以理解为无数多解的二元一次方程),所以就只有加密算法可记录

+ (NSString *)MD5SumWithString:(NSString *)string
{NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];uint8_t buffer[CC_MD5_DIGEST_LENGTH];CC_MD5(data.bytes, (CC_LONG)data.length, buffer);//如下注释代码与上述加密代码等效
//    data = [data MD5Sum];
//    Byte *buffer = (Byte *)data.bytes;
    NSMutableString *result = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++){[result appendFormat:@"%02x", buffer[i]];}return result;
}

说明:

A.需要特别强调的一点,看到许多开发者都采用如下方法将NSString转为NSData:

const char *cstr = [string cStringUsingEncoding:NSUTF8StringEncoding];

NSData *data = [NSData dataWithBytes:cstr length:string.length];

我不建议采用上述代码,经过测试,当字符串为纯英文字母、数字、符号时候,结果无异;但是当字符串包含中文时候,string.length取到的长度就有问题,因为一个中文字符转为NSData以后长度大于1,所以上述方法将导致中文转化后,内容丢失!

建议使用如下方法:NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];

B.MD2、MD4、SHA1、SHA224、SHA256、SHA384、SHA512加密算法,只需要将示例代码中buffer的长度CC_MD5_DIGEST_LENGTH和加密方法CC_MD5更换为对应名称即可。

C.注释代码作用与前两行一致。不过需要引用分类NSData+CommonCrypto.h。

D.data.bytes可以强转为(Byte *)和(char *),可以参考下述代码

E.result字符串的预留长度为CC_MD5_DIGEST_LENGTH * 2,因为buffer数组中元素类型为uint8_t(也就是unsigned char),在字符串格式化时候,以16进制形式显示两位,所以长度为2倍

F.%02x占位符表示以16进制显示两位,位数不足左边补0

G.补充一条,%p占位符表示输出变量内存地址

3.AES、DES加密和解密

 AES和DES加密过程:string -> data -> AES/DES encrypt -> base64 encode -> string;解密过程为逆向

+ (NSString *)AES256EncryptedString:(NSString *)string usingKey:(NSString *)key
{NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];NSData *encryptedData = [data AES256EncryptedDataUsingKey:key error:nil];NSData *base64Data = [GTMBase64 encodeData:encryptedData];NSString *result = [[NSString alloc] initWithData:base64Data encoding:NSUTF8StringEncoding];//    const char *buffer = (char *)base64Data.bytes;
//    result = [[NSString alloc] initWithCString:buffer encoding:NSUTF8StringEncoding];
//    result = [[NSString alloc] initWithBytes:base64Data.bytes length:base64Data.length encoding:NSUTF8StringEncoding];return result;
}+ (NSString *)decryptedAES256String:(NSString *)string usingKey:(NSString *)key
{NSData *base64Data = [string dataUsingEncoding:NSUTF8StringEncoding];NSData *decryptedData = [GTMBase64 decodeData:base64Data];NSData *data = [decryptedData decryptedAES256DataUsingKey:key error:nil];NSString* result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];return result;
}

此处增加了一个分类NSData+CommonCrypto,并在EncryptionHelper.m中引用,提供了AES和DES加密解密算法,感兴趣的朋友可以细看。

Github地址:https://github.com/ALongWay/AESCrypt-ObjC

说明:

A.AES加密方法中,生成result字符串,罗列了3种方式

B.DES加密过程中,只需将AES256EncryptedDataUsingKey替换为DESEncryptedDataUsingKey方法

C.DES解密过程中,只需将decryptedAES256DataUsingKey替换为decryptedDESDataUsingKey方法

罗列一下测试代码输出结果:

    NSString *message = @"测试各种加密解密方法abc123+=/";NSString *key = @"xyz123这是key";NSString *base64Msg = [EncryptionHelper base64EncodeWithString:message];NSString *decodeMsg= [EncryptionHelper decodeBase64WithString:base64Msg];NSString *md5Msg = [EncryptionHelper MD5SumWithString:message];NSString *sha1Msg = [EncryptionHelper SHA1HashWithString:message];NSString *sha256Msg = [EncryptionHelper SHA256HashWithString:message];NSString *aes256Msg = [EncryptionHelper AES256EncryptedString:message usingKey:key];NSString *decryptedAESMsg = [EncryptionHelper decryptedAES256String:aes256Msg usingKey:key];NSString *desMsg = [EncryptionHelper DESEncryptedString:message usingKey:key];NSString *decryptedDESMsg = [EncryptionHelper decryptedDESString:desMsg usingKey:key];

2016-09-08 17:46:43.505 base[7128:9029057] message:测试各种加密解密方法abc123+=/; key:xyz123这是key
2016-09-08 17:46:43.506 base[7128:9029057] base64Msg:5rWL6K+V5ZCE56eN5Yqg5a+G6Kej5a+G5pa55rOVYWJjMTIzKz0v
2016-09-08 17:46:43.506 base[7128:9029057] decodeMsg:测试各种加密解密方法abc123+=/
2016-09-08 17:46:43.506 base[7128:9029057] md5Msg:55d86b31f8cf9b3007a303664237fc8d
2016-09-08 17:46:43.506 base[7128:9029057] sha1Msg:1465c756f0eb64c7cccf175022a84ecd82f8faae
2016-09-08 17:46:43.506 base[7128:9029057] sha256Msg:297050d60416bbf0a84856fc9986a2bbe8a528a75377f7e1b011c4971c884a02
2016-09-08 17:46:43.506 base[7128:9029057] aes256Msg:seDPZ6RLHavklYxJOP9uMc7QoOZXZ8DASp6YHoe40B+6QkZ9Xhtn+Ecx5tPqakor
2016-09-08 17:46:43.506 base[7128:9029057] decryptedAESMsg:测试各种加密解密方法abc123+=/
2016-09-08 17:46:43.506 base[7128:9029057] desMsg:uXGaL4ChwSJt5HoD+gU9T/9L8K4eCVFEg5MyzivJRQxBRhAvfTou2Q==
2016-09-08 17:46:43.507 base[7128:9029057] decryptedDESMsg:测试各种加密解密方法abc123+=/

base项目已更新:git@github.com:ALongWay/base.git

转载于:https://www.cnblogs.com/ALongWay/p/5853970.html

App开发流程之加密工具类相关推荐

  1. iOS 直播类APP开发流程

    (一) iOS 直播类APP开发流程分解: 1 . 音视频处理的一般流程: 数据采集→数据编码→数据传输(流媒体服务器) →解码数据→播放显示 1.数据采集: 摄像机及拾音器收集视频及音频数据,此时得 ...

  2. (转载)iOS直播类APP开发流程

    转载自博主:iOS_developer_zhong,博客地址: http://blog.csdn.net/zhonggaorong/article/details/51483282 本文为大家分享了i ...

  3. Java 开发中常用的 4 种加密方法。MD5加密工具类测试 base64加密工具类测试 SHA加密工具类测试 BCrypt加密工具类测试

    一.工具类 1, md5加密工具类 2, base64加密工具类 3, Bcrypt工具类 二.加密测试 MD5加密测试 base64加密测试 SHA加密测试 BCrypt加密测试 一.工具类 1, ...

  4. android开发监听媒体播放器,Android开发之媒体播放工具类完整示例

    本文实例讲述了Android开发之媒体播放工具类.分享给大家供大家参考,具体如下: package com.maobang.imsdk.util; import android.media.Media ...

  5. 开发安卓app游戏_「安卓APP开发流程」安卓APP如何开发的?

    21世纪,智能手机走进了人们的生活,现在的智能手机的操作系统基本分为两种,一种是IOS系统(苹果系统).安卓系统,其中,安卓系统是开源的,所以很多品牌商会讲安卓包装成自己的系统,但核心还是一样的,都是 ...

  6. APP开发流程实例讲解-儒释道网络电台八天开发全程-百度云深度兼容测试并进一步优化排错

    APP开发流程实例讲解-儒释道网络电台八天开发全程之 百度云深度兼容测试并进一步优化排错 APP开发流程实例讲解-儒释道网络电台八天开发全程 项目发起 功能和界面初步设定 在Android Studi ...

  7. 安卓app开发方案_「安卓APP开发流程」安卓APP如何开发的?

    21世纪,智能手机走进了人们的生活,现在的智能手机的操作系统基本分为两种,一种是IOS系统(苹果系统).安卓系统,其中,安卓系统是开源的,所以很多品牌商会讲安卓包装成自己的系统,但核心还是一样的,都是 ...

  8. Android加密工具类,Android AES加密工具类分享

    1.AES加密工具类 java不支持PKCS7Padding,只支持PKCS5Padding.我们知道加密算法由算法+模式+填充组成,下一篇介绍iOS和Android通用的AES加密,本篇文章使用PK ...

  9. JAVA加密工具类实例

    工具类还是老套路,要让用户可扩展,同时提供一个基础工具即可,本文分享BeginCode的用户密码加密工具类的使用, 如果不为了扩展性,可以写成工具类即可,提供两个静态方法如下 一个方法是直接MD5加密 ...

最新文章

  1. 生活随笔:保险公司来的电话
  2. Object-C,NSArraySortTest,数组排序3种方式
  3. 输入5门学科的成绩,编写程序求其平均分。要求用函数完成,科目存放在指针申请的动态空间中。
  4. bzoj4006 [JLOI2015]管道连接
  5. C/C++[codeup 2044]神奇的口袋
  6. 远程控制软件teamview好用么?
  7. 【游戏引擎Easy2D】三分钟学会游戏的控制移动,键盘识别详解
  8. java教务排课系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
  9. VS编程之查看数组信息
  10. 炫酷渐变色背景粒子线条折线连接canvas动画
  11. 干得漂亮!微信封禁大量色情账号
  12. 无公网服务器(ip)做内网穿透
  13. Unity3D笔记六 GUI游戏界面
  14. 【品質管理】【レビュー】_ブレーンストーミングとKJ法<転載>
  15. 灰度共生矩阵的原理及代码实现(python)
  16. STM32F103C8T6硬件SPI控制6针/7针0.96寸OLED显示屏
  17. 信号与系统1-关于卷积的那些事
  18. 神经网络的简介和特点,神经网络的简介和应用
  19. Matlab watershed函数
  20. 访问 IIS 元数据库失败(转)

热门文章

  1. 设计模式 简单工厂模式
  2. 小程序 数据缓存
  3. POJ 1655 Balancing Act (树的重心)
  4. ASP.NET-get与post模式的区别
  5. 【hadoop】有参考价值的博客整理
  6. [存储引擎基础知识]InnoDB与MyISAM的六大区别(非原创)
  7. 《大话数据结构》读后总结(六)
  8. typescript tslint rules config
  9. Neo4j: 迁移MySQL的数据到Neo4j
  10. [转载]Java数据库设计中的14个技巧