在iOS開(kāi)發(fā)中(應(yīng)該說(shuō)在所有的開(kāi)發(fā)中),數(shù)據(jù)的安全性都是非常重要的。下面就簡(jiǎn)單的說(shuō)一下數(shù)據(jù)加密的一些方式。
MD2 、MD3、 MD4 、MD5 (MD6) Message-Digest Algorithm(信息-摘要算法),現(xiàn)在主要是MD5,前面的由于存在缺陷就被淘汰啦,而MD6的話(huà)現(xiàn)在還處于測(cè)試階段。 具體的算法的更深層次的介紹請(qǐng)移步Google。
SHA1 、SHA224 、SHA256 、SHA384 、SHA512 安全哈希算法 (安全散列算法)(Secure Hash Algorithm),散列是信息的提煉,通常其長(zhǎng)度要比信息小得多,且為一個(gè)固定長(zhǎng)度。加密性強(qiáng)的散列一定是不可逆的,這就意味著通過(guò)散列結(jié)果,無(wú)法推出任何部分的原始信息。任何輸入信息的變化,哪怕僅一位,都將導(dǎo)致散列結(jié)果的明顯變化,這稱(chēng)之為雪崩效應(yīng)。散列還應(yīng)該是防沖突的,即找不出具有相同散列結(jié)果的兩條信息。具有這些特性的散列結(jié)果就可以用于驗(yàn)證信息是否被修改。 查看更多介紹
HmacMD5 、HmacSHA1 、HmacSHA224 、HmacSHA256 、HmacSHA384 、HmacSHA512 這些加密算法和上邊的相比較的話(huà),區(qū)別就在于這些需要一個(gè)秘鑰去和消息輸入,生成消息摘要作為輸出。這些加密用在服務(wù)器驗(yàn)證客戶(hù)端非常合適:
客戶(hù)端發(fā)送請(qǐng)求之后,服務(wù)器收到返回一個(gè)隨機(jī)數(shù),同時(shí)在會(huì)話(huà)中保存該隨機(jī)數(shù),客戶(hù)端將信息和返回的隨機(jī)數(shù)用這些算法簽名發(fā)送給服務(wù)器,服務(wù)器用剛才記錄的隨機(jī)數(shù)和去數(shù)據(jù)庫(kù)讀取相應(yīng)信息(如用戶(hù)名密碼)采用同樣的散列算法加密和客戶(hù)端傳過(guò)來(lái)的簽名信息對(duì)比,從而驗(yàn)證客戶(hù)端是否合法(被攔截篡改等)。 更多介紹
RSA 公鑰加密算法,加密方使用公鑰加密,解密方持有私鑰解密,公鑰和私鑰是唯一匹配的,但是有公鑰是無(wú)法計(jì)算出私鑰的。該加密算法可以公開(kāi)加密算法和公鑰。用在服務(wù)器驗(yàn)證客戶(hù)端也是非常的nice。
上面的加密算法除了 RSA都是不可逆加密,再看一下下面的可逆加密算法:
DES 、3DES 、AES 、RC2、RC4、RC2、CAST、Blowfish。通過(guò)秘鑰和初始化向量采用一直加密模式進(jìn)行加密。加密模式如下幾種:
ECB模式,相對(duì)簡(jiǎn)單,易于實(shí)現(xiàn),相同的明文產(chǎn)生相同密文,所以安全性相對(duì)沒(méi)那么高,該模式下初始化向量會(huì)被忽略。 CBC模式,需要初始化向量,誤差會(huì)傳遞,安全性高于ECB模式。 CFB模式,需要初始化向量,隱藏了明文模式,容易造成錯(cuò)誤傳播,加密的速率有所降低。 OFB模式,不利于并行化處理,克服了誤差傳遞的問(wèn)題。 更多模式詳細(xì)信息
以上算法在iOS中的實(shí)現(xiàn)
好在上面的算法Apple都是為我們實(shí)現(xiàn)了,我們只需要調(diào)用相應(yīng)的接口即可。在這里我們自己寫(xiě)了一個(gè)接口,對(duì)加密算法進(jìn)行一點(diǎn)封裝,更利于項(xiàng)目中使用(主要是系統(tǒng)的C函數(shù)N個(gè)參數(shù),看起來(lái)累啊!)。
首先我們枚舉了加密方式
|
1
|
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è)接口
|
1
|
@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);/** * 針對(duì)可逆加密的解密方法 */- (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
|
這樣的話(huà)我們就能得到加密的方式,加密之后的data以及加密之后的字符串,同時(shí)還可以選擇是否進(jìn)行base64編碼等非常方便,至于實(shí)現(xiàn)的話(huà),主要是調(diào)用系統(tǒng)的加密實(shí)現(xiàn),然后再整。一定要記得導(dǎo)入#import 哦
|