>

可以将任意的二进制数据进行Base64编码,MD5有以

- 编辑:澳门博发娱乐官网 -

可以将任意的二进制数据进行Base64编码,MD5有以

在服务器与极端设备进行HTTP通讯时,平常会被网络抓包、反编写翻译(Android APK反编写翻译工具)等本领获得HTTP通信接口地址和参数。为了保险信息的平安,大家亟须进行接口参数加密和平解决密。本文只讲原理,代码完结可以另去百度。

为了避防大家的数目败露,我们往往会对数据开展加密,特别是乖巧数据,我们供给的安全性越来越高。下边将介绍二种常用的加密算法使用。那个算法的加密对象都以基于二进制数据,借使要加密字符串就接纳统一编码实行编码后加密。

前言

一、Base6

原理:

  • base64的编码都以按字符串长度,以每3个8bit的字符为一组
  • 然后针对每组,首先获得每一种字符的ASCII编码
  • 然后将ASCII编码转变到8bit的二进制,获得一组3*8=24bit的字节
  • 下一场再将那24bit细分为4个6bit的字节,并在每种6bit的字节前边都填四个高位0,获得4个8bit的字节
  • 下一场将那4个8bit的字节调换来10进制,对照Base64编码表 ,获得相应编码后的字符。注:1、 要求被编码字符是8bit的,所以须在ASCII编码范围内,u0000-u00ff,普通话就可怜。2、 假如被编码字符长度不是3的倍数的时候,则都用0代替,对应的出口字符为=
  • base64的编码都以按字符串长度,以每3个8bit的字符为一组,
  • 下一场针对每组,首先取得各样字符的ASCII编码,
  • 下一场将ASCII编码转变到8bit的二进制,获得一组3*8=24bit的字节
  • 下一场再将那24bit分开为4个6bit的字节,并在每种6bit的字节前边都填五个高位0,获得4个8bit的字节
  • 然后将那4个8bit的字节调换到10进制,对照Base64编码表 ,获得相应编码后的字符。

、MD5和base64加密

** MD5简介**MD5是三个贵港的哈希算法,输入多个不一样的当众不会博得一致的输出值,依据输出值,不能够赢得原始的公然,即其经过不可逆;MD5有以下八个最关键的特征。

  • 加密的不可逆性,只好够加密,不能解密。
  • 率性长度的公然经过加密后长度都以定点的,长度为16进制三十五人。

它还会有以下两种特色

  1. 轻松总计:依据原数据计算出MD5很轻便
  2. 抗修改性:MD5对原数据足够的灵敏,哪怕只修改了二个字节,获得的MD5的值与此前的MD5数值都有极大的歧异。
  3. 防伪品质高:已知原数据和它的MD5值,想要找到同样MD5值得数据是十二分不便的,能够说大约是不容许的。

** base64 简介**

  • base64的编码都以按字符串长度,以每3个8bit的字符为一组,
  • 然后针对每组,首先获得每一种字符的ASCII编码,
  • 然后将ASCII编码调换到8bit的二进制,获得一组3*8=24bit的字节
  • 下一场再将那24bit细分为4个6bit的字节,并在种种6bit的字节前面都填多少个高位0,得到4个8bit的字节
  • 接下来将那4个8bit的字节转变到10进制,对照Base64编码表 ,获得相应编码后的字符。

** Base64 编码表 **

Value Char Value Char Value Char Value Char
0 A 16 Q 32 g 48 w
1 B 17 R 33 h 49 x
2 C 18 S 34 i 50 y
3 D 19 T 35 j 51 z
4 E 20 U 36 k 52 0
5 F 21 V 37 l 53 1
6 G 22 W 38 m 54 2
7 H 23 X 39 n 55 3
8 I 24 Y 40 o 56 4
9 J 25 Z 41 p 57 5
10 K 26 a 42 q 58 6
11 L 27 b 43 r 59 7
12 M 28 c 44 s 60 8
13 N 29 d 45 t 61 9
14 O 30 e 46 u 62 +
15 P 31 f 47 v 63 /
  • MD5: 全称为message digest algorithm 5, 能够开展加密, 不过不能够解密, 属于单向加密, 平常用于文书校验。MD5 运算结果是四个恒久长度为1二十八人的二进制数,经过一名目许多的演算获得三十二个16进制数。(每壹人16进制数能够替代4位二进制数,所以1贰十六人二进制数写成16进制就改为了128/4=叁十个。)
  • Base64: 把自由连串的8为字节描述为不能直接用眼睛辨识的款式, 平日用于邮件、http加密. 登入的顾客名和密码字段通过它加密, 能够开展加密和解密。base64算法正是将浏览器中不一样意出现的+=号给替换到-.那个标识。
  • 干什么用md5算法加密后又要利用base64算法进行编码:因为md5加密后得到的多寡是1贰十七个人的字节数组,将字节数组用base64算法加密后收获的是字符串,这样便于在其在数据库中的存款和储蓄

图片 1MD5校验文件流程

常用的摘要算法有MD5,SHA1。摘要算法是贰个不可逆进度,正是不管多大数量,经过算法运算后都以变化固定长度的数额,一般结果运用16进制举办展示。MD5和SHA1的分别:MD5结实是1二十四人摘要,SHa1是1六10位摘要。那么MD5的进度越来越快,而SHA1的强度更高。

大家所说的加密方法,都以对二进制编码的格式举行加密的,对应到Python中,则是大家的Bytes。

系统自带的base64代码
 //只支持加密英文 NSString *originStr = @"originStr"; NSData* originData = [originStr dataUsingEncoding:NSASCIIStringEncoding]; NSString* encodeResult = [originData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed]; NSLog(@"encodeResult=%@",encodeResult); NSData* decodeData = [[NSData alloc] initWithBase64EncodedString:encodeResult options:0]; NSString* decodeStr = [[NSString alloc] initWithData:decodeData encoding:NSASCIIStringEncoding]; NSLog(@"decodeStr=%@",decodeStr);

**注:1. 供给被编码字符是8bit的,所以须在ASCII编码范围内,u0000-u00ff,普通话就拾叁分。

、AES+Base64加密

简轻易单的MD5/Base64等业已难以满意当下的多少安全标准,本文简单的介绍下AES与Base64的名不副实加密与解密"

** ASE简介 **AES 是三个迭代的、对称密钥分组的密码,它能够选择128、192 和 2伍拾四个人密钥,况兼用 1贰十七个人分组加密和解密数据,对称密钥密码使用同样的密钥加密和平解决密数据。通过分组密码重返的加密数据的位数与输入数据一致。迭代加密应用一个周而复始结构,在该循环中另行置换和替换输入数据。

图片 2ASE对称加密

下边统一运用MD5算法进行求证,SHA1附近。首要用途有:验证音讯完整性,安全访谈认证,数据签字。

将字符串和Bytes互相调换能够接纳encode()和decode()方法。

二、SSkeychain第三方加密 接纳DES 对本地化客户名 密码举办加密 对称加密

  1. 假使被编码字符长度不是3的翻番的时候,则都用0代替,对应的输出字符为=**

    //只帮助加密斯洛伐克(Slovak)语 NSString originStr = @"originStr"; NSData originData = [originStr dataUsingEncoding:NSASCIIStringEncoding]; NSString encodeResult = [originData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed]; NSLog(@"encodeResult=%@",encodeResult); NSData decodeData = [[NSData alloc] initWithBase64EncodedString:encodeResult options:0]; NSString* decodeStr = [[NSString alloc] initWithData:decodeData encoding:NSASCIIStringEncoding]; NSLog(@"decodeStr=%@",decodeStr);

、AES+RSA加密

** SportageSA是非对称加密 **

概念:公钥:给需要加密方私钥:解密者自己留密钥生成过程:1:随机选择两个质数p、q,计算出 n=p x q2:计算出不大于N与N互质的数的数量 f x .3:取e不大于f互质的数.4:计算出e x d mod f = 1 时 d的值.5:则为公钥为私钥加密过程:原文^e mod n = 密文解密过程:密文^d mod n = 原文

有关君越SA的国有钥拥有以下注重特点:

  • 对此贰个私钥,有且唯有三个与之相应的公钥。生成者负担生成私钥和公钥,并保留私钥,公开公钥
  • 公钥是当着的,但不可能因此公钥反推出私钥,或然说极难反推,只可以穷举,所以假诺密钥丰盛长度,要经过穷举而获取私钥,大概是不容许的
  • 通过私钥加密的密文只可以通过公钥解密,公钥加密的密文唯有因而私钥解密

AES加密也叫对称加密:A用密码对数据进行AES加密后,B用同一的密码对密文进行AES解密。

具体操作方法:

  1. 在巅峰中运用openssl方式输入密钥的连带属性,然后在顶峰当前所在的地方下,生成公钥和私钥共7个公文(7个文件怎么着使用请看附录的进行了链接)。

  2. 那时借使Android客商端具有公钥PublicKey,服务器端具备公钥PublicKey和私钥PrivateKey。

  3. 安卓发送须求到劳动器端,安卓随机生成Byte[]私自密码,纵然RandomKey=“123456”,通过AES算法,对Json数据运用实行加密。

  4. 但是此时服务器并不知道顾客端的RandomKey是哪些,因而供给同不常候将Randomkey传给服务器,不然服务器无法透过AES对Json数据开展解密。可是只要一直发送央求,Randomkey就能够暴光,所以要对RandomKey进行不可逆的逍客SA加密。

  5. 安卓将接纳Randomkey举行AES加密的Json数据,和使用PublicKey进行KugaSA加密的RandomKey通过HTTP传送到服务器端。数据诉求工作完结。

  6. 劳动器端接收到AES加密的Json数据和传祺sa加密的RandomKey数据。

  7. 服务器通过私钥PrivateKey对加密后的RandomKey进行CR-Vsa解密。得到安卓生成的原始Randomkey。

  8. 动用本来的RandomKey对加密后的Json数据开展AES对称解密。至此已经得到安卓端发过来的原始Json数据。进行健康的服务器业务操作,然后将回来数据经过安卓端的RandomKey进行AES加密gouhou后,Response重返。

  9. 安卓端接收到Response的数量后,利用在此以前当地转移的RandomKey直接开展AES解密就能够。

图片 3AES+本田UR-VSA加密流程

  • 音讯完整性:由于每一份数据变动的MD5值不一样等,因而发送数据时得以将数据和其MD5值一齐发送,然后就足以用MD5验证数据是还是不是错失、修改。
  • 康宁访谈认证:那是使用了算法的不可逆性质,(正是不能够从MD5值中苏醒原数据)对账号登入的密码进行MD5运算然后保存,那样能够确定保证除了客户之外,即便数据库管理职员都不能得知客户的密码。
  • 数字签名:那是结合非对称加密算法和CA证书的一种选取境况。

图片 4

DES原理

DES是二个分组加密算法,它以六十五个人为分组对数据加密。陆拾伍位一组的精晓从算法的一端输入,六十二个人的密文从另一段输出。它是一个对称算法:加密和平化解密用的是同多个算法。密钥经常表示为64人的数,但种种第8位都看作奇偶校验,能够忽略,所以密钥长度为58人。密钥能够是随意的55位的数,且可在随性所欲的时候改造。DES算法只可是是加密的八个为主技艺——混乱和扩散的咬合,即先替代前置换,它依照密钥功效于明文,那是一轮,DES在公然分组上实践16轮一样的三结合技巧。

  • 用pod下载第三方 pod 'GTMBase64', '~> 1.0.0'
  • 写GTMBase64工具类,这里我用FLTBase64.h为例:
  • FLTBase64.h文件

一般破解方法:字典法,就是将常用密码生成MD5值字典,然后反向寻觅达到破解指标,因而建议利用强密码。

URL编码

此处用第三方SSKeychain 保存客户名密码 本地化加密

pod 'SSKeychain'

  • 加密、解密代码
NSString *bundleID = [NSBundle mainBundle].bundleIdentifier; [SSKeychain setPassword:@"111" forService:bundleID account:@"ni"]; [SSKeychain setPassword:@"222" forService:bundleID account:@"wo"]; [SSKeychain setPassword:@"333" forService:bundleID account:@"ta"]; NSString *passwords = [SSKeychain passwordForService:bundleID account:@"wo"]; NSLog(passwords);
 //对文件进行MD5摘要 public static String getMD5(String path){ String pathName = path; String md5= ""; try { File file = new File; FileInputStream ins = new FileInputStream; FileChannel ch = ins.getChannel(); MappedByteBuffer byteBuffer = ch.map(FileChannel.MapMode.READ_ONLY, 0,file.length; MessageDigest md = MessageDigest.getInstance; md.update(byteBuffer); ins.close(); md5 = toHexString(md.digest; } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return md5; } //以16进制编码进行输出 final static char hex[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; public static String toHexString(byte[] tmp){ String s; char str[] = new char[tmp.length*2]; int k =0; for (int i = 0; i < tmp.length; i++) { byte byte0 = tmp[i]; str[k++] = hex[byte0>>>4&0xf]; str[k++] = hex[byte0&0xf]; } s=new String; return s; }

 //对文件进行SHA1摘要 public static String getSHA1(String path){ String pathName = path; String sha1= ""; try { File file = new File; FileInputStream ins = new FileInputStream; FileChannel ch = ins.getChannel(); MappedByteBuffer byteBuffer = ch.map(FileChannel.MapMode.READ_ONLY, 0,file.length; MessageDigest sha = MessageDigest.getInstance; sha.update(byteBuffer); ins.close(); sha1 = toHexString(sha.digest; } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return sha1; }

好端端的ULX570L中是不得不分包ASCII字符的,相当于字符、数字和有些符号。而UHavalL编码便是一种浏览器用来防止url中冒出特殊字符的编码格局。

三、AES加密 对称加密

#import <Foundation/Foundation.h>@interface FLTBase64 : NSObject+ (NSString*)encodeBase64String:(NSString *)input;+ (NSString*)decodeBase64String:(NSString *)input;+ (NSString*)encodeBase64Data:data;+ (NSString*)decodeBase64Data:data;@end

能够窥见大家的显要代码正是

图片 5

原理:

AES 是多少个新的能够用于掩护电子数据的加密算法。鲜明地说,AES 是三个迭代的、对称密钥分组的密码,它能够接纳128、192 和 256人密钥,并且用 1贰十六人分组加密和平化解密数据。与公共密钥密码使用密钥对两样,对称密钥密码使用同样的密钥加密和平消除密数据。通过分组密码再次来到的加密数据 的位数与输入数据一致。迭代加密应用贰个周而复始结构,在该循环中重复置换(permutations )和替换(substitutions)输入数据。Figure 1 出示了 AES 用193位密钥对八个15个人字节数据块进行加密和平解决密的情形。

  • FLTBase64.m文件
 MessageDigest sha = MessageDigest.getInstance; sha.update(byteBuffer); ins.close(); byte[] r = sha.digest;

Base64编码

参预第三方AES文件
  • 克隆文件
  • 拖动AES文件到本人项目。
  • 加密代码
// AES加密  对称加密 NSString *password = @"password";//一般来说用户名就是用户密码的Key NSString *passwordKey = @"userName"; NSString *encryptedData = [AESCrypt encrypt:password password:passwordKey];//加密 NSString *messagepassword = [AESCrypt decrypt:encryptedData password:passwordKey]; //解密 NSLog(@"加密结果 = %@",encryptedData); NSLog(@"解密结果 = %@",messagepassword);
  • 加密实例代码
-saveUserNameAndPwd:(NSString *)userName andPwd:(NSString *)pwd { NSUserDefaults * settings = [NSUserDefaults standardUserDefaults]; [settings removeObjectForKey:@"UserName"]; [settings removeObjectForKey:@"Password"]; [settings setObject:userName forKey:@"UserName"]; pwd = [AESCrypt encrypt:pwd password:@"pwd"]; [settings setObject:pwd forKey:@"Password"]; [settings synchronize]; } -(NSString *)getPwd { NSUserDefaults * settings = [NSUserDefaults standardUserDefaults]; NSString * temp = [settings objectForKey:@"Password"]; return [AESCrypt decrypt:temp password:@"pwd"]; }

只是不相同的算法早先化时不一样而已。MessageDigest.getInstance其它还能采用

Base64是一种用62个字符来代表自便二进制数据的方法。

四、MD5摘要算法

#import "FLTBase64.h"#import <GTMBase64.h>@implementation FLTBase64+ (NSString*)encodeBase64String:(NSString * )input { NSData *data = [input dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES]; data = [GTMBase64 encodeData:data]; NSString *base64String = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; return base64String;}+ (NSString*)decodeBase64String:(NSString * )input { NSData *data = [input dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES]; data = [GTMBase64 decodeData:data]; NSString *base64String = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; return base64String;}+ (NSString*)encodeBase64Data:data { data = [GTMBase64 encodeData:data]; NSString *base64String = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; return base64String;}+ (NSString*)decodeBase64Data:data { data = [GTMBase64 decodeData:data]; NSString *base64String = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; return base64String;}@end

本文由胜博发-编程发布,转载请注明来源:可以将任意的二进制数据进行Base64编码,MD5有以