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

  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








    原文作者:哈希算法
    原文地址: https://blog.csdn.net/HONG321/article/details/75308554
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞