从这篇记录开始,记录的都算是干货了,都是一些编程日常的积累。
我建议先将基础的工具加入项目,后续的开发效率会呈指数增长。如果在专注功能开发过程中,才发现缺少大量常用的工具,不仅会打断思路,还会拖慢开发节奏。
当然,在每个项目开始的时候,不可能将全部工具都准备充分,只能依据个人的经验来评估需要提前准备的工具。
一个好的工匠,必须要有一个好的工具箱,并且还要不断优化它。
稍微扩展一下项目架构。
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
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+=/
App开发流程之加密工具类的更多相关文章
-
App开发流程之图像处理工具类
先罗列一下工具类中提供的方法: /** * 根据原始view和毛玻璃样式,获取模糊视图,并自动作为原view的subview(如果不需要作为子视图,自行调用removeFromSuperview) * ...
-
wemall app商城源码android开发MD5加密工具类
wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享android开发MD5加密工具类主要代码,供 ...
-
20个可以帮你简化iOS app开发流程的工具
这里推荐20个可以帮你简化iOS app开发流程的工具.很多开发者都使用过这些工具,涉及原型和设计.编程.测试以及最后的营销,基本上涵盖了整个开发过程. 原型和设计 有了一个很好的创意后,你要做的不是 ...
-
iOS开发之工具篇-20个可以帮你简化移动app开发流程的工具
如果想进入移动app开发这个领域,你总能从别的开发者或者网上或者书上找到各种各样的方法和工具,对于新手来说,还没有摸清门路就已经陷入迷茫了.这里推荐20个可以帮你简化app开发流程的工具.很多开发者都 ...
-
android开发MD5加密工具类(一)
MD5加密工具类整理: package com.gzcivil.utils; import java.io.UnsupportedEncodingException; import java.secu ...
-
JBPM4入门——4.封装流程管理的工具类(JbpmUtil)
本博文只是简要对JBPM4进行介绍,如需更详细内容请自行google 链接: JBPM入门系列文章: JBPM4入门——1.jbpm简要介绍 JBPM4入门——2.在eclipse中安装绘制jbpm流 ...
-
加密工具类 - CryptoUtils.java
加密工具类,包含MD5,BASE64,SHA,CRC32的加密与解密方法. 源码如下:(点击下载 - CryptoUtils.java.commons-io-2.4.jar.commons-code ...
-
java 加密工具类(MD5、RSA、AES等加密方式)
1.加密工具类encryption MD5加密 import org.apache.commons.codec.digest.DigestUtils; /** * MD5加密组件 * * @autho ...
-
跨平台app开发(引擎)工具的选择【转】
跨平台app开发(引擎)工具的选择 1.html5执行速度慢,用户体验不好 2.原生应用开发,即ios和安卓分别开发,需要两种技术人员,后期代码维护困难,很难达到统一. 3.xamarin是一款c#的 ...
随机推荐
-
代码提交时让svn忽略classpath、target、.project等
在用eclipse操作时,经常用到svn的与资源同步这个操作,但是打开的时候会有很多生成的class文件,其实这些并不需要提交的,因为svn原则上是用来管理源代码的.每次资源同步时看到很多class文 ...
-
nodeschool.io 10
~~ TIME SERVER ~~ Write a TCP time server! Your server should listen to TCP connections on port 8000 ...
-
linux 安装SVN
1.环境centos6.4 2.安装svnyum -y install subversion 3.配置 建立版本库目录mkdir /www/svndata svnserve -d -r /www/sv ...
-
深入理解css中vertical-align属性
一.为什么要写这篇文章 今天看到一个问题: 两个div 都设置 display:inline-block,正常显示:但是在第二个div中加一个块级元素或者内联元素,显示就变了个样,为什么? <m ...
-
putty 的美化
1. 中文乱码问题. 这个问题由来已久,每当我查看 mount到linux下的windows 中文目录的时候,都是一堆乱码, putty 也拒绝我输入中文, 一句话,这玩意,对中文过敏. ...
-
Page Object设计模式实践
Page Object模式是使用Selenium的广大同行最为公认的一种设计模式.在设计测试时,把元素和方法按照页面抽象出来,分离成一定的对象,然后再进行组织. Page Object模式,创建一个对 ...
-
Mastering Markdown
What is markdown? Markdown is a lightweight and easy-to-use syntax for styling all forms writing on ...
-
[lightoj P1306] Solutions to an Equation
[lightoj P1306] Solutions to an Equation You have to find the number of solutions of the following e ...
-
Docker数据卷和Docker系统管理(二)
一. 在镜像中定义卷 1. Dockerfile中定义卷的案例 VOLUME /app/data VOLUME /app/data, /app/profiles, /app/config VOLUME ...
-
苹果ATS特性服务器配置指南 HTTPS 安卓可以用 IOS 报错。
解决方案:https://www.qcloud.com/document/product/400/6973 ATS检测:https://www.qcloud.com/product/ssl#userD ...