淺析iOS開發(fā)過程中常用的加密算法

在iOS開發(fā)中(應(yīng)該說在所有的開發(fā)中),數(shù)據(jù)的安全性都是非常重要的。下面就簡單的說一下數(shù)據(jù)加密的一些方式。

淺析iOS開發(fā)過程中常用的加密算法

MD2 、MD3、 MD4 、MD5 (MD6) Message-Digest Algorithm(信息-摘要算法),現(xiàn)在主要是MD5,前面的由于存在缺陷就被淘汰啦,而MD6的話現(xiàn)在還處于測試階段。

SHA1 、SHA224 、SHA256 、SHA384 、SHA512 安全哈希算法 (安全散列算法)(Secure Hash Algorithm),散列是信息的提煉,通常其長度要比信息小得多,且為一個(gè)固定長度。加密性強(qiáng)的散列一定是不可逆的,這就意味著通過散列結(jié)果,無法推出任何部分的原始信息。任何輸入信息的變化,哪怕僅一位,都將導(dǎo)致散列結(jié)果的明顯變化,這稱之為雪崩效應(yīng)。散列還應(yīng)該是防沖突的,即找不出具有相同散列結(jié)果的兩條信息。具有這些特性的散列結(jié)果就可以用于驗(yàn)證信息是否被修改。

HmacMD5 、HmacSHA1 、HmacSHA224 、HmacSHA256 、HmacSHA384 、HmacSHA512 這些加密算法和上邊的相比較的話,區(qū)別就在于這些需要一個(gè)秘鑰去和消息輸入,生成消息摘要作為輸出。這些加密用在服務(wù)器驗(yàn)證客戶端非常合適:

客戶端發(fā)送請求之后,服務(wù)器收到返回一個(gè)隨機(jī)數(shù),同時(shí)在會(huì)話中保存該隨機(jī)數(shù),客戶端將信息和返回的隨機(jī)數(shù)用這些算法簽名發(fā)送給服務(wù)器,服務(wù)器用剛才記錄的隨機(jī)數(shù)和去數(shù)據(jù)庫讀取相應(yīng)信息(如用戶名密碼)采用同樣的散列算法加密和客戶端傳過來的簽名信息對比,從而驗(yàn)證客戶端是否合法(被攔截篡改等)。

RSA 公鑰加密算法,加密方使用公鑰加密,解密方持有私鑰解密,公鑰和私鑰是唯一匹配的,但是有公鑰是無法計(jì)算出私鑰的。該加密算法可以公開加密算法和公鑰。用在服務(wù)器驗(yàn)證客戶端也是非常的好。

上面的加密算法除了 RSA都是不可逆加密,再看一下下面的可逆加密算法:

DES 、3DES 、AES 、RC2、RC4、RC2、CAST、Blowfish。通過秘鑰和初始化向量采用一直加密模式進(jìn)行加密。加密模式如下幾種:

ECB模式,相對簡單,易于實(shí)現(xiàn),相同的明文產(chǎn)生相同密文,所以安全性相對沒那么高,該模式下初始化向量會(huì)被忽略。 CBC模式,需要初始化向量,誤差會(huì)傳遞,安全性高于ECB模式。 CFB模式,需要初始化向量,隱藏了明文模式,容易造成錯(cuò)誤傳播,加密的速率有所降低。 OFB模式,不利于并行化處理,克服了誤差傳遞的問題。

以上算法在iOS中的實(shí)現(xiàn)

好在上面的算法Apple都是為我們實(shí)現(xiàn)了,我們只需要調(diào)用相應(yīng)的接口即可。在這里我們自己寫了一個(gè)接口,對加密算法進(jìn)行一點(diǎn)封裝,更利于項(xiàng)目中使用。

首先我們列舉了加密方式

typedef NS_ENUM(NSInteger, HCDStringEncryptType) { HCDStringEncryptTypeMD2 = 0, HCDStringEncryptTypeMD4, HCDStringEncryptTypeMD5, HCDStringEncryptTypeSHA1, HCDStringEncryptTypeSHA224, HCDStringEncryptTypeSHA256, HCDStringEncryptTypeSHA384, HCDStringEncryptTypeSHA512, HCDStringEncryptTypeHmacMD5, //可以有密鑰 HCDStringEncryptTypeHmacSHA1, //可以有密鑰 HCDStringEncryptTypeHmacSHA256, //可以有密鑰 HCDStringEncryptTypeHmacSHA384, //可以有密鑰 HCDStringEncryptTypeHmacSHA512, //可以有密鑰 HCDStringEncryptTypeHmacSHA224, //可以有密鑰 HCDStringEncryptTypeRC2 = 100, // /*****************************/ HCDStringEncryptTypeRC4, // /*****************************/ HCDStringEncryptTypeAES, // /*****************************/ HCDStringEncryptTypeAES128, // /*** using default ECB mode **/ //AES目前只支持AES、AES128 HCDStringEncryptTypeDES, // /***** 初始化向量iv會(huì)被忽略 ****/ HCDStringEncryptType3DES, // /*****************************/ HCDStringEncryptTypeCAST, // /*****************************/ HCDStringEncryptTypeBlowfish, // /*****************************/};
然后定義了這么一個(gè)接口

@interface HCDStringEncryptObject : NSObject- (nullable HCDStringEncryptObject *)initWithOriginString:(nullable NSString *)originString keyString:(nullable NSString *)keyString encryptType:(HCDStringEncryptType)encryptType isBase64:(BOOL)base64;- (void)base64 NS_AVAILABLE(10_9, 7_0);- (void)base64Decode NS_AVAILABLE(10_9, 7_0);/** * 針對可逆加密的解密方法 */- (void)decode;@property (nonatomic,readonly,getter=isBase64) BOOL base64;@property (nonatomic,readonly) HCDStringEncryptType encryptType;@property (strong, nonatomic, nullable,readonly) NSString *keyString;@property (strong, nonatomic, nullable,readonly) NSString *originString;@property (strong, nonatomic, nullable,readonly) NSString *encryptedString; //解密之后和originString 一樣@property (strong, nonatomic, nullable,readonly) NSData *encryptedData; //解密之后是originString的NSData@end

這樣的話我們就能得到加密的方式,加密之后的data以及加密之后的字符串,同時(shí)還可以選擇是否進(jìn)行base64編碼等非常方便,至于實(shí)現(xiàn)的話,主要是調(diào)用系統(tǒng)的加密實(shí)現(xiàn),然后再整。一定要記得導(dǎo)入#import哦。