网络安全——Base64编码、MD5、SHA1-SHA512、HMAC(SHA1-SHA512)哈希

阅读目录

  • 一、Base64编码
  • 二、MD5、SHA1、SHA256、SHA512、HMAC实现
  • github代码下载地址

据说今天520是个好日子,为什么我想起的是502、500、404这些?还好服务器没事!

一、Base64编码

Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个0,形成8位一个字节的形式,这样每一个字节的有效位为6位,则取值范围0~630 ~ (2^6 - 1)。如果最后剩下的字符不到3个字节,则用0填充,输出字符使用'=',因此我们看到Base64末尾会有1到2个'='。另外标准还要求每76个字符要插入换行(不过,这个视具体情况定)。

iOS7之后苹果有自己的Base64编码解码API,NSData的扩展:NSData (NSDataBase64Encoding)

两种存储方式

  • 可见字符串形式

为了保证所输出的每一个编码字节都是可读字符,而不是0~63这些数字,Base64制作了一个码表,就像ASCII码表一样,每一个Base64码值都有对应的字符。64个可读字符从0到63非别是A-Z、a-z、0-9、+、/,这也是Base64名字的由来。

  • 以16进制形式

即NSData形式保存,Base64编码结果为字符,而这些字符又对应ASCII码表的码值,NSData就是存储ASCII码表的码值。

下面举个例子,并以苹果提供的API来详细介绍Base64编码解码过程:

假设我们对字符串"123"进行Base64编码,"123"对应的16进制是313233,二进制为00110001、00110010、00110011,将其变为4*6结果即下表中的第一行。然后根据Base64的码表,它们分别对应表中的第二行。那么"123"编码的最终结果即为MTIz,以字符串的形式保存。然后根据MTIz对应ASCII码值,以NSData形式存储,如表中的第三行。

转换为4*6结果 00001100 00010011 00001000 00110011
Base64对应字符 M T I z
对应ASCII码值(16进制) 4d 54 49 7a

上面的过程通过代码实现如下:

// 1 待编码的原始字符串
NSString *plainStr = @"123";
// 2 将其转换成NSData保存,那么"123"对应的ASCII码表码值是31、32、33(16进制)
NSData *plainData = [plainStr dataUsingEncoding:NSUTF8StringEncoding]; // 3.1 将其进行Base64编码,且结果以字符串形式保存,对应表中的第二行 NSString *baseStr = [plainData base64EncodedStringWithOptions:0]; // 3.2 将其进行Base64编码,且结果以NSData形式保存 NSData *base64Data = [plainData base64EncodedDataWithOptions:0];

另外对于参数NSDataBase64EncodingOptions选项,有多种取值

  • NSDataBase64Encoding64CharacterLineLength:每64个字符插入\r或\n
  • NSDataBase64Encoding76CharacterLineLength:每76个字符插入\r或\n,标准中有要求是76个字符要换行,不过具体还是自己定
  • NSDataBase64EncodingEndLineWithCarriageReturn:插入字符为\r
  • NSDataBase64EncodingEndLineWithLineFeed:插入字符为\n

前两个选项为是否允许插入字符,以及多少个字符长度插入,两个可以选其一或者都不选。后两个选项代表要插入的具体字符。比如我们想76个字符后插入一个\r则可以NSDataBase64Encoding76CharacterLineLength | NSDataBase64EncodingEndLineWithCarriageReturn。而在上面举的例子中选项为0,则代表不插入字符。

第三方框架

在iOS7之前我们一般用的都是第三方框架,比如nicklockwood写的https://github.com/nicklockwood/Base64还有Google的GTMBase64,虽然苹果有了自己的实现,但是许多其它的加密框架都用到了它,所以还是要了解一下,另外它还提供任意长度字符插入\r\n,而苹果只能是64或76长度。

二、MD5、SHA1、SHA256、SHA512、HMAC实现

主要用于验证,防止信息被修改。介绍请参照http://www.jianshu.com/p/003b85fd3e36。

具体的实现参考第三方框架:https://github.com/kelp404/CocoaSecurity。非常全面,不过不是太方便,比如想要获得MD5结果

NSString *plainStr = @"123";
CocoaSecurityResult *md5 = [CocoaSecurity md5:plainStr];
// 获取md5结果
NSString *md5Str = md5.hexLower;

不能直接plainStr.MD5Hash就获得字符串形式的结果,这里我封装了一个,可以参见工程中的NSString+Hash类https://github.com/mddios/EncryptionTools,可以直接对字符串进行操作,类似plainStr.MD5Hash、plainStr.sha1Hash···plainStr.sha256Hash···,非常方便。

比如对@"123"哈希,下面用上面提到的两种方法举例:

- (void)hashTest {NSString *plainStr = @"123";// md5CocoaSecurityResult *md5 = [CocoaSecurity md5:plainStr];NSLog(@"md5:%lu---%@---%@",plainStr.md5Hash.length, plainStr.md5Hash,md5.hex); // 40 CocoaSecurityResult *sha1 = [CocoaSecurity sha1:plainStr]; NSLog(@"sha1:%lu---%@---%@",plainStr.sha1Hash.length, plainStr.sha1Hash,sha1.hex); // 56 CocoaSecurityResult *sha224 = [CocoaSecurity sha224:plainStr]; NSLog(@"sha224:%lu---%@---%@",plainStr.sha224Hash.length,plainStr.sha224Hash,sha224.hex); // 64 CocoaSecurityResult *sha256 = [CocoaSecurity sha256:plainStr]; NSLog(@"sha256:%lu---%@---%@",plainStr.sha256Hash.length,plainStr.sha256Hash,sha256.hex); // 96 CocoaSecurityResult *sha384 = [CocoaSecurity sha384:plainStr]; NSLog(@"sha384:%lu---%@---%@",plainStr.sha384Hash.length,plainStr.sha384Hash,sha384.hex); // 128 CocoaSecurityResult *sha512 = [CocoaSecurity sha512:plainStr]; NSLog(@"sha512:%lu---%@---%@",plainStr.sha512Hash.length,plainStr.sha512Hash,sha512.hex); // hmac CocoaSecurityResult *hmacmd5 = [CocoaSecurity hmacMd5:plainStr hmacKey:plainStr]; NSLog(@"hmacmd5:%lu---%@---%@",[plainStr hmacMD5WithKey:plainStr].length,[plainStr hmacMD5WithKey:plainStr],hmacmd5.hex); }
  • 在电脑终端来获取结果

封装的代码中NSString+Hash.h头文件,有具体列出终端命令方法,如下:

/// 返回结果:32长度   终端命令:md5 -s "123"
- (NSString *)md5Hash;/// 返回结果:40长度   终端命令:echo -n "123" | openssl sha -sha1
- (NSString *)sha1Hash;/// 返回结果:56长度 终端命令:echo -n "123" | openssl sha -sha224 - (NSString *)sha224Hash; /// 返回结果:64长度 终端命令:echo -n "123" | openssl sha -sha256 - (NSString *)sha256Hash; /// 返回结果:96长度 终端命令:echo -n "123" | openssl sha -sha384 - (NSString *)sha384Hash; /// 返回结果:128长度 终端命令:echo -n "123" | openssl sha -sha512 - (NSString *)sha512Hash; #pragma mark - HMAC /// 返回结果:32长度 终端命令:echo -n "123" | openssl dgst -md5 -hmac "123" - (NSString *)hmacMD5WithKey:(NSString *)key; /// 返回结果:40长度 echo -n "123" | openssl sha -sha1 -hmac "123" - (NSString *)hmacSHA1WithKey:(NSString *)key; - (NSString *)hmacSHA224WithKey:(NSString *)key; - (NSString *)hmacSHA256WithKey:(NSString *)key; - (NSString *)hmacSHA384WithKey:(NSString *)key; - (NSString *)hmacSHA512WithKey:(NSString *)key;
  • 关于MD5加盐,只是多了下面第一行
plainStr = [plainStr stringByAppendingString:salt];
NSString *md5Str = plainStr.md5Hash;

github代码下载地址

https://github.com/mddios/EncryptionTools

转载于:https://www.cnblogs.com/VzhanggengD/p/6626419.html

网络安全——Base64编码、MD5、SHA1-SHA512、HMAC(SHA1-SHA512)哈希相关推荐

  1. java 加密 BASE64,MD5, SHA,HMAC

    简单的java加密算法有: BASE64 严格地说,属于编码格式,而非加密算法 MD5(Message Digest algorithm 5,信息摘要算法) SHA(Secure Hash Algor ...

  2. python学习笔记(二十七) -- 常用内建模块(二) Base64、MD5、SHA1、hmac

    目录 base64 hashlib MD5 SHA1 hmac base64 原理 base64就是对二进制数据进行编码,比如我有6字节的二进制数据,然后每3个字节分为一组,也就是一组有3*8 = 2 ...

  3. openssl算法 —— 利用openssl进行BASE64编码解码、md5/sha1摘要、AES/DES3加密解密

    openssl 加密字符串的方法: 一.利用openssl命令进行BASE64编码解码(base64 encode/decode): 1. BASE64编码命令 对字符串'abc'进行base64编码 ...

  4. linux之用openssl命令Base64编码解码、md5/sha1摘要、AES/DES3加密解密

    1.我们先看openssl help命令会输出什么? 2.我们用openssl命令实现字符串和文本的Base64编码和解码 openssl base64 openssl base64 -d 3.我们用 ...

  5. JS常见加密 AES、DES、RSA、MD5、SHAI、HMAC、Base64(编码) - Python/JS实现

    主要加密算法前言 本文仅仅介绍了常见的一些JS加密,并记录了JS和Python的实现方式 常见的加密算法基本分为这几类: (1)base64编码伪加密 (2)线性散列算法(签名算法)MD5 (3)安全 ...

  6. 【密码算法 之八】Hash类算法(单向散列函数) MD5 \ SHA1 \ SHA224 \ SHA256 \ SHA384 \ SHA512等浅析

    1. 综述   Hash算法,又称单向散列函数(one-way hash function).   单向散列函数有一个输入和一个输出,其中输入称为消息(message),输出称为散列值(hash va ...

  7. c# 实现MD5,SHA1,SHA256,SHA512等常用加密算法

    using System; using System.IO; using System.Data; using System.Text; using System.Diagnostics; using ...

  8. MessageDigest实现单向加密(MD5、SHA1、SHA-256、SHA-512)

    单向加密与双向加密 双向加密是加密算法中最常用的,它将可以直接理解的明文数据加密为不可直接理解的密文数据,然后,在需要的时候,可以使用一定的算法将这些加密以后的密文解密为原来可以理解的明文.双向加密适 ...

  9. java-信息安全(一)-BASE64,MD5,SHA,HMAC,RIPEMD算法

    概述 信息安全基本概念: BASE64 编码格式 Base58 编码 MD5(Message Digest algorithm 5,信息摘要算法) SHA(Secure Hash Algorithm, ...

  10. HMAC加密并且以hex/base64编码输出结果的在线工具

    hex格式输出结果 codebeautify.org是一个免费的在线HMAC加密生成器网站.这个网站提供一个简单的HMCA加密生成器,只需要选择一个算法.密文和密钥即可进行生成HMAC加密代码.此外, ...

最新文章

  1. maven-source 1.3 中不支持注释请使用 -source 5 或更高版本以启用注释
  2. 如何在 Flutter 中禁用默认的 Widget 飞溅效果
  3. react 组件怎么公用_React、Redux与复杂业务组件的复用
  4. mysql 服务器 kill进程_mysql查询结束进程kill
  5. vue双向数据绑定的原理
  6. 005-JQuery之CSS
  7. 全国计算机等级考试题库二级C操作题100套(第94套)
  8. .NET 6新特性试用 | DateOnly和TimeOnly类型
  9. mysql支持的平台和操作系统_MySQL 数据库所支持的操作系统_MySQL
  10. 特斯拉工程师当UP主评测自动驾驶,结果被公司开除
  11. jsp 9对象4作用域
  12. 滚动模式_违停车辆有可能被强制拖车!嘉兴交警开启滚动式兵团化作战模式
  13. mysql导入1366_mysql source导入报错ERROR 1366的解决方法
  14. Ubuntu卸载图形界面
  15. python全套完整教程-Python语言基础50课 全套完整版(含doc版)
  16. 程序员翻车时的 30 种常见反应!第21个深有感触...
  17. SSM常用面试题整理一
  18. python中算术位移运算
  19. Zephyr DMA
  20. 周志华 AdaBoost报告总结

热门文章

  1. python的设计具有很强的可读性_Python是什么?具有怎么样的特点呢?
  2. 怎么使用systemctl启动rabbitmq_光纤激光切割机已经很久没有使用了。再次重新启动它,该怎么办?...
  3. Python爬虫实践(一) -- 社交网站用户信息爬取
  4. grasshopper for rhino 6下载_漫谈算法设计与脚本语言(grasshopper, python)
  5. Redis performance --- delete 100 records at maximum
  6. 算法与数据结构1800题 之字符串(一)
  7. oracle表的操作简述
  8. JFinal开发8个常见问题
  9. mapreduce实现矩阵相乘
  10. 【鱼眼镜头1】鱼眼镜头的四种投影模型(指导镜头的设计),中央镜头综述