美文网首页
iOS-加密

iOS-加密

作者: Imkata | 来源:发表于2019-11-14 18:02 被阅读0次

一. 关于加密

1. 安全散列算法

Secure Hash Algorithm,常见的算法包括了 MD5SHA家族、HMAC 等。

将任意长度的二进制值映射为较短的固定长度的二进制值,这个短的二进制值称为哈希值,这个算法具有不可逆、碰撞低等特性。同时该类算法可以用作数字签名,用来证实某个信息确实是由某个人发出的,同时可以保证信息没有被修改。

实际上,简单来说,这种算法有两个特性:
A) 不同的输入一定得出不同的 hash 值;
B) 无法从 hash 值倒推出原来的输入。

2. 对称加密

symmetric-key encryption,其中常见的算法包括了 AESDES、3DES、RC4 等。

对称加密指的是可以使用同一个密钥对内容进行加密和解密,相比非对称加密,它的特点是加/解密速度快,并且加密的内容长度几乎没有限制,缺点是一旦密钥泄露,别人也能解密数据。

3. 非对称加密

asymmetric/public-key encryption,常见的加密算法有 RSA、DSA、ECC 等。

非对称加密有两个密钥,分别为公钥和私钥,其中公钥公开给所有人,私钥永远只能自己知道。

使用公钥加密的信息只能使用私钥解密,使用私钥加密只能使用公钥解密。前者用来传输需要保密的信息,因为全世界只有知道对应私钥的人才可以解密;后者用来作数字签名,因为公钥对所有人公开的,可以用来确认这个信息是否是从私钥的拥有者发出的。

详细内容请查看原文👇

原文地址:iOS常见加密算法总结

原作者github地址:https://github.com/chenxi141017/blog

二. MD5加密算法

  1. 简单说明
    MD5:全称是“Message Digest Algorithm 5”,译为“消息摘要算法第5版”
    效果:对输入信息生成唯一的128位散列值(32个字符)

  2. MD5的特点
    ① 输入两个不同的明文不会得到相同的输出值
    ② 根据输出值,不能得到原始的明文,即其过程不可逆

  3. MD5的应用
    由于MD5加密算法具有较好的安全性,而且免费,因此该加密算法被广泛使用,主要运用在数字签名、文件完整性验证以及口令加密等方面。

  4. MD5破解
    直接使用MD5加密可以被破解网站破解,MD5解密网站:http://www.cmd5.com

cmd5

MD5改进:

现在的MD5已不再是绝对安全,因此,可以对MD5稍作改进,以增加破解的难度。

  1. 先乱序,后加密,就是加盐(Salt):在明文的固定位置插入随机串,然后再进行MD5。
  2. 先加密,后乱序:先对明文进行MD5,然后对加密得到的MD5串的字符进行乱序。

总之宗旨就是:黑客就算攻破了数据库,也无法解密出正确的明文。

举例说明:

#import "ViewController.h"
#import "NSString+Hash.h"

#define Salt @"fsdhjkfhjksdhjkfjhkd546783765"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    [self digest4:@"123"]; //
    [self digest4:@"abc"];
    [self digest4:@"456"];
}

/**
 *  直接用MD5加密
 */
- (NSString *)digest:(NSString *)str
{
    NSString *anwen = [str md5String];
    NSLog(@"%@ - %@", str, anwen);
    return anwen;
}

/**
 *  加盐
 */
- (NSString *)digest2:(NSString *)str
{
    str = [str stringByAppendingString:Salt];
    
    NSString *anwen = [str md5String];
    NSLog(@"%@ - %@", str, anwen);
    return anwen;
}

/**
 *  多次MD5
 */
- (NSString *)digest3:(NSString *)str
{
    NSString *anwen = [str md5String];
    
    anwen = [anwen md5String];
    
    NSLog(@"%@ - %@", str, anwen);
    return anwen;
}

/**
 *  先加密, 后乱序
 */
- (NSString *)digest4:(NSString *)str
{
    NSString *anwen = [str md5String];
    
    // 注册:  123 ----  2CB962AC59075B964B07152D234B7020
    
    // 登录: 123 --- 202CB962AC59075B964B07152D234B70
    
    NSString *header = [anwen substringToIndex:2];
    NSString *footer = [anwen substringFromIndex:2];
    anwen = [footer stringByAppendingString:header];
    
    NSLog(@"%@ - %@", str, anwen);
    return anwen;
}
@end

打印:

直接使用MD5加密(去MD5解密网站即可破解)

2019-11-14 17:39:19.756320+0800 加密[1637:136552] 123 - 202cb962ac59075b964b07152d234b70
2019-11-14 17:39:19.756447+0800 加密[1637:136552] abc - 900150983cd24fb0d6963f7d28e17f72
2019-11-14 17:39:19.756524+0800 加密[1637:136552] 456 - 250cf8b51c773f3f8dc8b4be867a9a02

使用加盐(通过MD5解密之后,很容易发现规律)

2019-11-14 17:40:45.093899+0800 加密[1677:138250] 123fsdhjkfhjksdhjkfjhkd546783765 - ea4d90423e35126b92565a01c6181517
2019-11-14 17:40:45.094137+0800 加密[1677:138250] abcfsdhjkfhjksdhjkfjhkd546783765 - 09613109a9672ba60c0eb9c456c8b0b2
2019-11-14 17:40:45.094349+0800 加密[1677:138250] 456fsdhjkfhjksdhjkfjhkd546783765 - 9125e7153a18c667e8cfe10cfbcc2baa

多次MD5加密(使用MD5解密之后,发现还是密文,那就接着MD5解密,即可破解)

2019-11-14 17:42:41.410832+0800 加密[1706:140308] 123 - d9b1d7db4cd6e70935368a1efb10e377
2019-11-14 17:42:41.410997+0800 加密[1706:140308] abc - ec0405c5aef93e771cd80e0db180b88b
2019-11-14 17:42:41.411100+0800 加密[1706:140308] 456 - 54a2ec5f4421fa24bfa9bf6461e649a2

先加密,后乱序(破解难度增加)

2019-11-14 17:43:19.845757+0800 加密[1723:140972] 123 - 2cb962ac59075b964b07152d234b7020
2019-11-14 17:43:19.845885+0800 加密[1723:140972] abc - 0150983cd24fb0d6963f7d28e17f7290
2019-11-14 17:43:19.845988+0800 加密[1723:140972] 456 - 0cf8b51c773f3f8dc8b4be867a9a0225

Demo地址:MD5加密

三. base64

加密:

NSString *base64String = [data base64EncodedStringWithOptions:0];
NSData *base64Data = [data base64EncodedDataWithOptions:0];

解密:

NSData *baseData = [[NSData alloc] initWithBase64EncodedString:base64String options:0];
NSData *baseData = [[NSData alloc] initWithBase64EncodedData:baseData options:0];

相关文章

网友评论

      本文标题:iOS-加密

      本文链接:https://www.haomeiwen.com/subject/amarictx.html