日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

App开发流程之加密工具类

發布時間:2024/4/15 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 App开发流程之加密工具类 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

從這篇記錄開始,記錄的都算是干貨了,都是一些編程日常的積累。

我建議先將基礎的工具加入項目,后續的開發效率會呈指數增長。如果在專注功能開發過程中,才發現缺少大量常用的工具,不僅會打斷思路,還會拖慢開發節奏。

當然,在每個項目開始的時候,不可能將全部工具都準備充分,只能依據個人的經驗來評估需要提前準備的工具。

一個好的工匠,必須要有一個好的工具箱,并且還要不斷優化它。

?

稍微擴展一下項目架構。

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加密和解密

 AESDES加密過程: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开发流程之加密工具类的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。