【Objective-C】哈希算法(MD5)工具类

时间:2021-01-01 03:53:29
  1、MD5算法是对任意一个二进制数据进行加密,可以得到定长的字符串结果。是一种单向加密。   2、MD5是散列(哈希)算法的一种,加密结果是32个字符。SHA1加密结果是40个字符。Git版本穿越用的就是SHA1。   3、对原文进行两次MD5的处理不安全,很容易就可以破解。(只要有足够多条的数据,就可以有很大可能被匹配出来,如www.cmd5.com)   4、对数据进行加盐,两年前用的比较多,现在用的少一些。这样可以保证MD5的安全。注意:“盐”是佐料,要够咸。   5、HMAC加密:[self.pwd hmacMD5StringWithKey:@“itheima”]    先使用密钥itheima对密码加密,再做md5。接着再次使用itheima加密,再次md5。现在使用比较广泛,安全级别更高,无法穷举法破解。    风险是:如果每次结果一致,有可能被暴力破解。   6、安全的密码要求是:同样的算法,同样的密码明文,每次的加密结果不一样。   可以使用时间戳密码,目前使用非常广泛:”zhang 2015-08-08 14:14    流程:    1、先对key进行一次MD5,把key值弄得足够复杂。    2、用MD5后的key对密码进行hmac    3、取得当前的系统时间,并且指定时区。真机通常需要指定时区    4、用密码加格式化后的时间    5、得出结果后再次hmac并返回
  7、服务器验证时间戳密码     用户注册的时候是用密码.hmac,存储到数据库中。     登录的时候根据上面的完整算法,把加密后的密码发送到服务器。服务器端从数据库中根据用户名拿到密码,跟客户端用同样的算法再加密一遍。注意:终端用的时间要从服务器端获取,确保用的和服务器端是用的同一个时间。时间精确到分,服务器端验证时要减1,这样密码的有效期不到两分钟。
潜在风险:用户第一次注册密码时被拦截,虽然被拦截的几率小。  辅助手段:ip绑定!电话绑定。。。

#import<Foundation/Foundation.h>

@interfaceNSString (Hash)
- (NSString*)md5String;
- (NSString*)hmacMD5StringWithKey:(NSString*)key;
@end

#import"NSString+Hash.h"
#import <CommonCrypto/CommonCrypto.h>
@implementationNSString (Hash)

- (NSString*)md5String {
const char *str =self.UTF8String;
uint8_t buffer[CC_MD5_DIGEST_LENGTH];

CC_MD5(str, (CC_LONG)strlen(str), buffer);

return [selfstringFromBytes:bufferlength:CC_MD5_DIGEST_LENGTH];
}

- (NSString*)hmacMD5StringWithKey:(NSString*)key {
const char *keyData = key.UTF8String;
const char *strData =self.UTF8String;
uint8_t buffer[CC_MD5_DIGEST_LENGTH];

CCHmac(kCCHmacAlgMD5, keyData, strlen(keyData), strData,strlen(strData), buffer);

return [selfstringFromBytes:bufferlength:CC_MD5_DIGEST_LENGTH];
}

@end