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