iOS 32、16位md5加密

MD5(MD5 Message-Digest Algorithm)

md5.jpg
  • 简介
    一种被广泛使用的可以产生出一个128位(即128个0和1的二进制位)的散列值的密码散列函数,实际开发常以16进制输出,即32位的16进制,简单说就是32个16进制的数,而16位实际上是从32位字符串中取第9位到第24位的部分。

  • 特点
    1、不同字符md5加密生成唯一的加密字符;
    2、加密后不可逆(即只能加密不能解密)。

  • 应用
    一般用来加密不需要解密的字符,以保证传输、存储过程中的安全,如用户密码保存,为了避免传输中被抓包与明文存储,使用md5加密,再比如,游戏过程中为了保证游戏的公平性,开奖后将结果md5保存至数据库,用户拿自己的结果与数据库中保存的结果对比,校验是否中奖。当前,md5算法因其普遍、稳定、快速的特点,仍广泛应用于普通数据的错误检查领域。

  • 缺陷
    1996年后被证实存在弱点,可以被加以破解,对于需要高度安全性的数据,专家一般建议改用其他算法,如SHA-2。2004年,证实MD5算法无法防止碰撞,因此不适用于安全性认证,如[SSL公开密钥认证]或是[数字签名]等用途;
    2009年,中国科学院的谢涛和冯登国仅用了220.96的碰撞算法复杂度,破解了MD5的碰撞抵抗,该攻击在普通计算机上运行只需要数秒钟。

  • 加盐
    由于现在计算机的发展与强大的碰撞库使得MD5之后的字符被破解性加强,所以有了在把目标字符md5后再加上一组随机字符串(理论上随机字符串越长,破解难度越大)然后再md5得输出值,使破解时间加长(空间换时间)。

  • 开发中注意事项
    由于md5区分16、32位与大小写,所以开发中需要前后端统一标准,不然双方校验通不过。

md5自用代码

HKMD5Encryption.h

#import <Foundation/Foundation.h>

#pragma mark - MD5加密
@interface HKMD5Encryption : NSObject


/**
 md5加密区分32、16位与大小写

 @param str 需要md5加密的字符串
 @param bateNum 填32即32位md5,16或32之外的即16位md5
 @param isLowercaseStr YES即小写,NO即大写

 @return md5加密后的字符串
 */
+ (NSString *)md5EncryptStr:(NSString *)str bateNum:(NSInteger)bateNum isLowercaseStr:(BOOL)isLowercaseStr;

@end

HKMD5Encryption.m

#import "HKMD5Encryption.h"
#import <CommonCrypto/CommonCrypto.h>

@implementation HKMD5Encryption

+ (NSString *)md5EncryptStr:(NSString *)str bateNum:(NSInteger)bateNum isLowercaseStr:(BOOL)isLowercaseStr {
    NSString *md5Str = nil;
    const char *input = [str UTF8String];//UTF8转码
    unsigned char result[CC_MD5_DIGEST_LENGTH];
    CC_MD5(input, (CC_LONG)strlen(input), result);
    NSMutableString *digestStr = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];//直接先获取32位md5字符串,16位是通过它演化而来
    for (NSInteger i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
        [digestStr appendFormat:isLowercaseStr ? @"%02x" : @"%02X", result[i]];//%02x即小写,%02X即大写
    }
    if (bateNum == 32) {
        md5Str = digestStr;
    } else {
        md5Str = [digestStr substringWithRange:NSMakeRange(8, 16)];
    }
    return md5Str;
}

@end

使用

    NSLog(@"md5加密16位小写--%@",[HKMD5Encryption md5EncryptStr:@"123qaz" bateNum:16 isLowercaseStr:YES]);
    NSLog(@"md5加密16位大写--%@",[HKMD5Encryption md5EncryptStr:@"123qaz" bateNum:16 isLowercaseStr:NO]);
    NSLog(@"md5加密32位小写--%@",[HKMD5Encryption md5EncryptStr:@"123qaz" bateNum:32 isLowercaseStr:YES]);
    NSLog(@"md5加密32位大写--%@",[HKMD5Encryption md5EncryptStr:@"123qaz" bateNum:32 isLowercaseStr:NO]);
    NSLog(@"md5加盐32位小写--%@",[HKMD5Encryption md5EncryptStr:[[HKMD5Encryption md5EncryptStr:@"123qaz" bateNum:32 isLowercaseStr:YES] stringByAppendingString:@"hooyking"] bateNum:32 isLowercaseStr:YES]);

打印结果

md5加密16位小写--7e9a217cced2f8aa
md5加密16位大写--7E9A217CCED2F8AA
md5加密32位小写--ae005ceb7e9a217cced2f8aa354187c7
md5加密32位大写--AE005CEB7E9A217CCED2F8AA354187C7
md5加盐32位小写--170cf7465238c4f022dafd35eab3663c

可以自己将打印结果放入浏览器md5破解网站查看结果,简单的能破解,复杂的不容易破解,加盐更加难,所以现在开发中常采用md5加盐(加入随机字符串)再md5。