MD5

约定

  • 同样的密码,同样的加密算法,每次加密的结果是不一样

密码方案

  • 方案一:直接 MD5

pwd = pwd.md5String;

非常不安全

  • 方案二 MD5 + 盐

pwd = [pwd stringByAppendingString:salt].md5String;

盐值要够咸,可以从服务器获取

  • 安全方案三 - HMAC

pwd = [pwd hmacMD5StringWithKey:@"heello world"];

相对之前的方案,安全级别要高很多,使用 heello world 对 pwd 进行加密,然后在进行 md5,然后再次加密,再次 md5

  • 安全方案四 - 时间戳密码

- (NSString *)timePassword {

// 1. 生成key

NSString *key = @"heello world".md5String;

NSLog(@"HMAC Key - %@", key);

// 2. 对密码进行 hmac 加密

NSString *pwd = [self.pwd hmacMD5StringWithKey:key];

// 3. 获取当前系统时间

NSDateFormatter *fmt = [[NSDateFormatter alloc] init];

fmt.locale = [NSLocale localeWithLocaleIdentifier:@"zh"];

fmt.dateFormat = @"yyyy-MM-dd HH:mm";

NSString *dateStr = [fmt stringFromDate:[NSDate date]];

NSLog(@"%@", dateStr);

// 4. 将系统时间拼接在第一次加密密码的末尾

pwd = [pwd stringByAppendingString:dateStr];

// 5. 返回拼接结果的再次 hmac

return [pwd hmacMD5StringWithKey:key];

}

密码时效大约两分钟,需要服务器脚本支持,安全级别高,不过客户端的时间与服务器的时间不同步

  • 安全方案五 - 服务器时间戳密码

/// 生成时间戳密码

- (NSString *)timePassword:(NSString *)pwd {

// 1. 以 heello world.md5 作为 hmac key

NSString *key = @"heello world".md5String;

NSLog(@"HMAC KEY - %@", key);

// 2. 对密码进行 hamc

NSString *pwd = [self.pwd hmacMD5StringWithKey:key];

// 3. 取服务器时间

NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://localhost/hmackey.php"]];

NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];

NSString *dateStr = dict[@"key"];

// 4. 拼接时间字符串

pwd = [pwd stringByAppendingString:dateStr];

// 5. 再次 hmac 散列密码

return [pwd hmacMD5StringWithKey:key];

}

/*

NSString *JpgPath = [[NSBundle mainBundle] pathForResource:@"MD5" ofType:@"jpg"];

NSData *data = [NSData dataWithContentsOfFile:JpgPath];

unsigned char result2[CC_MD5_DIGEST_LENGTH];

CC_MD5(data.bytes, (CC_LONG)data.length, result2);

NSMutableString *strr = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH];

for (int i = 0; i<CC_MD5_DIGEST_LENGTH; i++) {

[strr appendFormat:@"%02x",result2[i]];

}

NSLog(@"%@-------",strr);

//// pwd

#import <CommonCrypto/CommonCrypto.h>

@implementation NSString (md5Sting)

- (instancetype) MD5String {

unsigned char result[CC_MD5_DIGEST_LENGTH];

CC_MD5([self UTF8String], CC_MD5_DIGEST_LENGTH, result);

CC_MD5([self UTF8String], (CC_LONG)self.length, result);

NSMutableString *target = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH];

for (int i = 0; i<CC_MD5_DIGEST_LENGTH; i++) {

[target appendFormat:@"%02x",result[i]];

}

return target.copy;

}

*/

// 准备明文

NSString *OCString = @"hello world !";

unsigned char OCResult[CC_MD5_DIGEST_LENGTH];

// 加密

CC_MD5([OCString UTF8String], (CC_LONG)OCString.length, OCResult);

// 获取密文

NSMutableString *targetString = [[NSMutableString alloc]initWithCapacity:CC_MD5_DIGEST_LENGTH];

// 将加密的结果的数组内容以16进制的数拼接

for (int i = 0; i<CC_MD5_DIGEST_LENGTH; i++) {

[targetString appendFormat:@"%02X",OCResult[i]];

}

NSLog(@"====%@====",targetString);

MD5 (摘要加密)的更多相关文章

  1. 信息加密之信息摘要加密MD2、MD4、MD5

    对于用户数据的保密一直是各个互联网企业头疼的事,那如何防止用户的个人信息泄露呢?今天为大家介绍一种最简单的加密方式--信息摘要算法MD.它如何来保护用户的个人信息呢?其实很简单,当获得到用户的信息后, ...

  2. java中使用MD5进行加密 BASE64Encoder 编码

    原文地址:http://www.cnblogs.com/weiwangnuanyang/articles/4326336.html java中使用MD5进行加密     在各种应用系统的开发中,经常需 ...

  3. Java对字符串使用MD5进行加密(亲测有效)

    转自:https://blog.csdn.net/jay314159/article/details/4918358 前言: MD5即Message-Digest Algorithm 5(信息-摘要算 ...

  4. java中使用MD5进行加密

    java中使用MD5进行加密     在各种应用系统的开发中,经常需要存储用户信息,很多地方都要存储用户密码,而将用户密码直接存储在服务器上显然是不安全的,本文简要介绍工作中常用的 MD5加密算法,希 ...

  5. iOS中的MD5(base64)加密

    MD5(base64)是一种结合MD5摘要和base64编码的密文处理方式,加密后的结果为24位字符串,且后两位为==,例如:1的加密结果为xMpCOKC5I4INzFCab3WEmw==. 下面是加 ...

  6. MD5,BASE64Encoder加密

    package com.cn.peitest; import java.io.UnsupportedEncodingException; import java.security.MessageDig ...

  7. java实现MD5文件加密

    package me.zhengjie.modules.logdump.util; import java.io.FileInputStream; import java.io.IOException ...

  8. 将32位MD5摘要串转换为128位二进制字符串

    将32为MD5摘要串转换为128位二进制字符串: /// <summary> /// 将字符串转成二进制 /// </summary> /// <param name=& ...

  9. JS分段上传文件(File)并使用MD5.js加密文件段用来后台校验

    HTML <form method="POST" name="form1" action="/mupload/upload/" enc ...

随机推荐

  1. 【LintCode】删除链表中的元素

    问题分析: 声明当前指针和上一个指针即可. 问题求解: public class Solution { public ListNode removeElements(ListNode head, in ...

  2. python调用模块&函数

    一般模块是抽象的概念,按照功能划分模块,尽可能保证每个模块互相独立. 一般模块里有多个函数.当然,如果你愿意,也可以把一个几个模块写进一个大函数.对于python 模块,每个模块可以包含多个函数,但一 ...

  3. 使用HttpSessionListener接口监听Session的创建和失效

    转自:http://uule.iteye.com/blog/824115 HttpSessionListener : Session创建事件发生在每次一个新的session创建的时候,类似地Sessi ...

  4. UOJ263 【NOIP2016】组合数问题

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  5. HC-05初探

    catalogue . 蓝牙嗅探抓包 . HC05蓝牙模块AT模式设置 . USB转串口芯片CH340 . 蓝牙小车 1. 蓝牙嗅探抓包 针对蓝牙通信包的嗅探抓包不能直接使用wincap+wiresh ...

  6. Linux Process Virtual Memory

    目录 . 简介 . 进程虚拟地址空间 . 内存映射的原理 . 数据结构 . 对区域的操作 . 地址空间 . 内存映射 . 反向映射 .堆的管理 . 缺页异常的处理 . 用户空间缺页异常的校正 . 内核 ...

  7. js调用刷新

    _self.fireEvent('refresh');

  8. 一次pthread_kill引发的HA切换

    记录这个坑 程序设计是这样的 socket server主线程A接收新来的连接,然后新建一个线程B用于处理数据接收,由B线程启动一个线程C进行数据的发送处理. 当 B线程出现异常,在异常处理过程中,会 ...

  9. 加州大学伯克利分校Stat2.3x Inference 统计推断学习笔记: Section 5 Window to a Wider World

    Stat2.3x Inference(统计推断)课程由加州大学伯克利分校(University of California, Berkeley)于2014年在edX平台讲授. PDF笔记下载(Acad ...

  10. AlsaInfo

    这是一个不能不说的故事. 我装了Ubuntu以后,耳机一直不能用. 查了各种资料也搞不定. DEBUG声音问题时有一个重要的参考就是AlsaInfo,里面详细列出了关于声音的各种配置信息. 如何获得这 ...