在iOS在开发中(应该说在所有的开发中),数据的安全性非常重要。以下是一些数据加密的简要方法。
MD2.MD3.MD4.MD5(MD6)Message-DigestAlgorithm(信息-摘要算法)MD5.前者因缺陷被淘汰,前者因缺陷被淘汰。MD6的话还处于测试阶段。
SHA1.SHA224.SHA256.SHA384.SHA512安全哈希算法(安全散列算法)(SecureHashAlgorithm),散列是对信息的细化,通常比信息小得多,而且是一个固定的长度。强加密的散列必须是不可逆转的,这意味着原始信息的任何部分都不能通过散列结果来启动。任何输入信息的变化,甚至只有一个,都会导致散列结果的显著变化,这被称为雪崩效应。散列也应该防止冲突,即找不到两个具有相同散列结果的信息。具有这些特征的散列结果可用于验证信息是否被修改。
HmacMD5.HmacSHA1.HmacSHA224.HmacSHA256.HmacSHA384.HmacSHA与上述加密算法相比,512的区别在于,这些加密算法需要一个密钥来输入消息,并生成消息摘要作为输出。这些加密非常适合服务器验证客户端:
客户端发送请求后,服务器收到随机返回,并在会话中保存随机数。客户端通过这些算法签名将信息和返回的随机数发送给服务器。服务器使用刚才记录的随机数和去数据库读取相应的信息(如用户名密码),使用相同的分散算法加密与客户端发送的签名信息进行比较,从而验证客户端是否合法(被拦截篡改等)。
RSA公钥加密算法,加密方使用公钥加密,解密方持有私钥解密,公钥和私钥是唯一匹配的,但有公钥不能计算私钥。该加密算法可以公开加密算法和公钥。在服务器上验证客户端也很好。
除了上述加密算法RSA都是不可逆加密,再看下面的可逆加密算法:
DES.3DES.AES.RC2.RC4.RC2.CAST.Blowfish。通过密钥和初始化向量加密。加密模式如下:
ECB模型,相对简单,易于实现,相同的明文产生相同的密文,所以安全性相对较低,初始化向量将被忽略。CBC模式需要初始化向量,误差会传递,安全性高于ECB模式。CFB模式需要初始化向量,隐藏明文模式,容易造成错误传播,降低加密率。OFB模式不利于并行处理,克服了误差传递的问题。
以上算法在iOS中的实现
幸运的是,上述算法Apple都是为了我们,我们只需要调用相应的接口。这里我们自己写了一个接口,包装了一点加密算法,更有利于项目的使用。
首先,我们列出了加密方法
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, // /*****************************/};
然后定义了这么一个接口
@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。