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

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

阅读目录

据说今天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";
    // md5
    CocoaSecurityResult *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

时间: 2024-10-20 08:59:16

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

Base64编码 - Md5加密 - url编码

#pragma mark --------编码-------------- + (NSString * )encodeBase64:(NSString * )text { NSData * data = [text dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES]; // 转换到base64 data = [GTMBase64 encodeData:data]; NSString * base64String = [

HTML5 加密和摘要算法(base64,md5, sha1,rsa)

< 一 > BASE64 1,Base64 是网络上最常见的用于传输 8Bit 字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法 2,首先需要一个库 base64.js,已上传到博客园  =>  https://blog-static.cnblogs.com/files/lovling/base64.js   使用方式如下 <!DOCTYPE html> <html> <head> <meta charset=

MD5,SHA1,SHA256,SHA512等常用加密算法

using System; using System.IO; using System.Data; using System.Text; using System.Diagnostics; using System.Security; using System.Security.Cryptography; /* * .Net框架由于拥有CLR提供的丰富库支持,只需很少的代码即可实现先前使用C等旧式语言很难实现的加密算法.本类实现一些常用机密算法,供参考.其中MD5算法返回Int的ToString

java-信息安全(一)-BASE64,MD5,SHA,HMAC

概述 信息安全基本概念: BASE64 编码格式 MD5(Message Digest algorithm 5,信息摘要算法) SHA(Secure Hash Algorithm,安全散列算法) HMAC(Hash Message Authentication Code,散列消息鉴别码) Base64 按照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式.(The Base64 Content-Transfer-E

BASE64、MD5、SHA、HMAC几种加密算法

本篇内容简要介绍BASE64.MD5.SHA.HMAC几种加密算法.    BASE64编码算法不算是真正的加密算法.    MD5.SHA.HMAC这三种加密算法,可谓是非可逆加密,就是不可解密的加密方法,我们称之为单向加密算法.我们通常只把他们作为加密的基础.单纯的以上三种的加密并不可靠. BASE64 按照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式.(The Base64 Content-Transfe

Java实现 Base64、MD5、MAC、HMAC加密(转)

开始对那些基本的加密还不怎么熟练,然后总结了些,写了一个测试:支持 Base64.MD5.MAC.HMAC加密,长话短说,我们都比较喜欢自己理解,看代码吧! 采用的输UTF-8的格式... package codec; import java.security.MessageDigest; import javax.crypto.KeyGenerator; import javax.crypto.Mac; import javax.crypto.SecretKey; import javax.c

MD5加密及BASE64编码

MD5即Message-Digest Algorithm 5(信息-摘要算法5): 方法一: 添加jar包:${SPRING_HOME}/lib/jakarta-commons/commons-codec.jar import org.apache.commons.codec.digest.DigestUtils; public class MD5Util { // 返回md5加密后的字符串 public static String md5(String message) { String md

ios开发Base64编码以及加密相关学习

一:.Base64补充 ```objc 1.Base64简单说明 描述:Base64可以成为密码学的基石,非常重要. 特点:可以将任意的二进制数据进行Base64编码 结果:所有的数据都能被编码为并只用65个字符就能表示的文本文件. 65字符:A~Z a~z 0~9 + / = 对文件进行base64编码后文件数据的变化:编码后的数据~=编码前数据的4/3,会大1/3左右. 2.命令行进行Base64编码和解码 编码:base64 123.png -o 123.txt 解码:base64 123

Android数据加密之Base64编码算法

前言: 前面学习总结了平时开发中遇见的各种数据加密方式,最终都会对加密后的二进制数据进行Base64编码,起到一种二次加密的效果,其实呢Base64从严格意义上来说的话不是一种加密算法,而是一种编码算法,为何要使用Base64编码呢?它解决了什么问题?这也是本文探讨的东西?下面是其他数据加密链接地址: Android数据加密之Rsa加密 Android数据加密之Aes加密 Android数据加密之Des加密 Android数据加密之MD5加密 什么Base64算法? Base64是网络上最常见的