文档章节

iOS,一行代码进行RSA、DES 、AES、MD5加密、解密

hejunbinlan
 hejunbinlan
发布于 2016/07/28 21:38
字数 1223
阅读 29
收藏 6

加密的Demo

最近做了一个移动项目,是有服务器和客户端类型的项目,客户端是要登录才行的,服务器也会返回数据,服务器是用Java开发的,客户端要同时支持多平台(Android、iOS),在处理iOS的数据加密的时候遇到了一些问题。起初采取的方案是DES加密,老大说DES加密是对称的,网络抓包加上反编译可能会被破解,故采取RSA方式加密。RSA加密时需要公钥和私钥,客户端保存公钥加密数据,服务器保存私钥解密数据。(iOS端公钥加密私钥解密、java端公钥加密私钥解密,java端私钥加密公钥解密都容易做到,iOS不能私钥加密公钥解密,只能用于验签)。

问题

问题1:iOS端公钥加密的数据用Java端私钥解密。

iOS无论使用系统自带的sdk函数,用mac产生的或者使用java的jdk产生的公钥和私钥,进行加密解密自己都可以使用。不过ios加密,java解密,或者反过来就不能用了。要么是无法创建报告个-9809或-50的错误,要么解出来是乱码。ios系统函数种只有用公钥加密,私钥解密的方式。而公钥加密每次结果都不同。

MAC上生成公钥、私钥的方法,及使用
  • 1.打开终端,切换到自己想输出的文件夹下
  • 2.输入指令:openssl(openssl是生成各种秘钥的工具,mac已经嵌入
  • 3.输入指令:genrsa -out rsa_private_key.pem 1024 (生成私钥,java端使用的)
  • 4.输入指令:rsa -in rsa_private_key.pem -out rsa_public_key.pem -pubout (生成公钥)
  • 5.输入指令:pkcs8 -topk8 -in rsa_private_key.pem -out pkcs8_rsa_private_key.pem -nocrypt(私钥转格式,在ios端使用私钥解密时用这个私钥)
    注意:在MAC上生成三个.pem格式的文件,一个公钥,两个私钥,都可以在终端通过指令vim xxx.pem 打开,里面是字符串,第三步生成的私钥是java端用来解密数据的,第五步转换格式的私钥iOS端可以用来调试公钥、私钥解密(因为私钥不留在客户端)
    详细步骤

问题2:服务器返回数据也要加密,老大打算用java私钥加密,ios用公钥解密(由于iOS做不到用私钥加密公钥解密,只能私钥加密公钥验签),所以这种方案也有问题。

通过看一些大牛的介绍,了解了iOS常用的加密方式
  • 1 通过简单的URLENCODE + BASE64编码防止数据明文传输
  • 2 对普通请求、返回数据,生成MD5校验(MD5中加入动态密钥),进行数据完整性(简单防篡改,安全性较低,优点:快速)校验
  • 3 对于重要数据,使用RSA进行数字签名,起到防篡改作
  • 4 对于比较敏感的数据,如用户信息(登陆、注册等),客户端发送使用RSA加密,服务器返回使用DES(AES)加密
    原因:客户端发送之所以使用RSA加密,是因为RSA解密需要知道服务器私钥,而服务器私钥一般盗取难度较大;如果使用DES的话,可以通过破解客户端获取密钥,安全性较低。而服务器返回之所以使用DES,是因为不管使用DES还是RSA,密钥(或私钥)都存储在客户端,都存在被破解的风险,因此,需要采用动态密钥,而RSA的密钥生成比较复杂,不太适合动态密钥,并且RSA速度相对较慢,所以选用DES)
    所以此次加密,我们选择了第四种加密方式

加密方式

ios端进行DES加密、解密时非常方便

1、引入头文件 #import "DES3Util.h"
2、加密时调用类方法  +(NSString *) encryptUseDES:(NSString *)plainText key:(NSString *)key;
3、解密时调用类方法  +(NSString *)decryptUseDES:(NSString *)cipherText key:(NSString *)key;

ios端进行RSA加密、解密时非常方便

1、引入头文件 #import "RSAUtil.h"
2、公钥加密时调用类方法:
+ (NSString *)encryptString:(NSString *)str publicKey:(NSString *)pubKey;
+ (NSData *)encryptData:(NSData *)data publicKey:(NSString *)pubKey;
3、私钥解密时调用类方法 
+ (NSString *)decryptString:(NSString *)str privateKey:(NSString *)privKey;
+ (NSData *)decryptData:(NSData *)data privateKey:(NSString *)privKey;

ios端进行MD5加密、解密时非常方便

1、引入头文件 #import "MD5Util"
2、加密时调用方法:- (NSString *)md5:(NSString *)str;

ios端进行AES加密、解密时非常方便

1、引入头文件 #import "AES.h"
2、加密时调用方法
+ (NSString *)encrypt:(NSString *)message password:(NSString *)password;
2、解密时调用的方法
+ (NSString *)decrypt:(NSString *)base64EncodedString password:(NSString *)password;

有关RSA、MD5、AES加密的原理介绍

本文转载自:http://www.cnblogs.com/leixu/articles/5377176.html

共有 人打赏支持
hejunbinlan
粉丝 41
博文 584
码字总数 21362
作品 0
浦东
高级程序员
iOS 实现对称加密多种填充方式(ANSIX923、ISO10126、Zero)

前言 前段时间调研了iOS有关加密的框架.在查阅资料的过程中,有一篇《iOS加密解密:AES,DES,3DES,BLOWFISH(含有多种模式和算法说明)》 的文章。 在文章中作者对需要加密的数据实现PKCS7Pa...

_涼城
05/27
0
0
iOS中DES与MD5加密方案

MD5算法和DES算法是常见的两种加密算法。 MD5:MD5是一种不可逆的加密算法,按我的理解,所谓不可逆,就是不能解密,那么它有什么用的,它的用处大了,大多数的登录功能都会使用到这种算法。...

珲少
2015/04/03
0
0
iOS,一行代码进行RSA、DES 、AES、MD5加密、解密

iOS,一行代码进行RSA、DES 、AES、MD5加密、解密 加密的Demo,欢迎下载 java端的加密解密,读者可以看我同事的这篇文章http://www.jianshu.com/p/98569e81cc0b 最近做了一个移动项目,是有服...

法斗斗
2016/05/31
81
0
.net 安卓IOS跨平台des加解密双向的(可以互相加解密)

http://blog.sina.com.cn/s/blog_beda09820102v5fu.html .net 安卓IOS跨平台des加解密双向的(可以互相加解密) #region 跨平台加解密(c# 安卓 IOS) // public static string sKey = "1234...

壹峰
07/25
0
0
Objective-C 和 Java 下 DES加解密保持一致的方式

最近做了一个移动项目,是有服务器和客户端类型的项目,客户端是要登录才行的,登录的密码要用DES加密,服务器是用Java开发的,客户端要同时支持多平台(Android、iOS),在处理iOS的DES加密...

山哥
2012/04/19
0
5

没有更多内容

加载失败,请刷新页面

加载更多

MySQL数据库集群-PXC方案

网盘下载地址 MySQL数据库集群-PXC方案 PXC是开源的MySQL集群技术,如中国移动、阿里巴巴、腾讯、去哪网等企业均采用或者借鉴了PXC解决方案,可见该方案具有极佳的稳定性。本课程将在Linux环...

qq__2304636824
25分钟前
1
0
vue脚手架搭建项目

npm install -g vue-clivue init webpack my-projectcd my-projectnpm run dev

帝子兮
28分钟前
2
0
es6 字符串拓展方法

es6 include();返回Boolean,该字符串是否包含该字符 startWith() 返回Boolean,该字符串开头是否是该字符 endWith() 返回Boolean,该字符串结尾是否是该字符 repeat() 重复该字符串多少次,...

莫西摩西
29分钟前
1
0
Java语言实现word转PDF(10分钟解决)

前言: 经常做OA办公项目的同学一定和我一样被各种线上的office操作整疯了。基本上涉及到Java操作office的时候就会想到POI和openoffice.这两种方案都是需要找各种jar包,然后用里面繁杂的api。...

山里的红杏
30分钟前
1
0
Flask部分源码阅读

Flask主要依赖于Werkzeug和Jinja这两个库,是很简洁的Python Web框架。 Werkzeug 是一个WSGI的工具包,是Flask的核心库。 Jinja 则是一个模板渲染的库,主要负责渲染返回给客户端的html文件。...

Jian_Ming
34分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部