UI 公钥加密
RSA算法是一种非对称加密算法,常被用于加密数据传输.如果配合上数字摘要算法, 也可以用于文件签名.
本文将讨论如何在iOS中使用RSA传输加密数据.
RSA基本原理
RSA使用"秘匙对"对数据进行加密解密.在加密解密数据前,需要先生成公钥(public key)和私钥(private key).
- 公钥(public key): 用于加密数据. 用于公开, 一般存放在数据提供方, 例如iOS客户端.
- 私钥(private key): 用于解密数据. 必须保密, 私钥泄露会造成安全问题.
iOS中的Security.framework提供了对RSA算法的支持.这种方式需要对密匙对进行处理, 根据public key生成证书, 通过private key生成p12格式的密匙.
除了Secruty.framework, 也可以将openssl库编译到iOS工程中, 这可以提供更灵活的使用方式.
本文使用Security.framework的方式处理RSA.
#!/usr/bin/env bash
echo "Generating RSA key pair ..."
echo "1024 RSA key: private_key.pem"
openssl genrsa -out private_key.pem echo "create certification require file: rsaCertReq.csr"
openssl req -new -key private_key.pem -out rsaCertReq.csr echo "create certification using x509: rsaCert.crt"
openssl x509 -req -days -in rsaCertReq.csr -signkey private_key.pem -out rsaCert.crt echo "create public_key.der For IOS"
openssl x509 -outform der -in rsaCert.crt -out public_key.der echo "create private_key.p12 For IOS. Please remember your password. The password will be used in iOS."
openssl pkcs12 -export -out private_key.p12 -inkey private_key.pem -in rsaCert.crt echo "create rsa_public_key.pem For Java"
openssl rsa -in private_key.pem -out rsa_public_key.pem -pubout
echo "create pkcs8_private_key.pem For Java"
openssl pkcs8 -topk8 -in private_key.pem -out pkcs8_private_key.pem -nocrypt echo "finished."
Tips:
- 在创建证书的时候, terminal会提示输入证书信息. 根据wizard输入对应信息就OK.
- 在创建p12密匙时, 会提示输入密码, 此时的密码必须记住, 之后会用到.
- 如果上面指令有问题,请参考最新的openssl官方文档, 以官方的为准. 之前在网上搜索指令, 被坑了一圈之后, 还是会到啃官方文档上. 每条指令文档在最后都会有几个sample,参考sample即可.
iOS如何加载使用证书
代码依赖Base64编码库, 如果使用cocoapods, 可以讲下面依赖添加到Podfile:
加密数据 、解密数据
先引入RSA文件
#import "ViewController.h"
#import "RSA.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib. // 获取公钥的数据
// 公钥的iOS客户端使用,我们打到公钥以后,只需要根据公钥处理数据就可以了
NSString *publicKey = @"-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCuNX8J0NZ1jvIyfzhgga/2+4/dUqqN15ijWVmWWxpfzdph1aG3UlH3SfPplgfeSuPBZUokD6WW70LSQKgbd74jcz5GoBXN40WxGTXfP5sTbcQqM5UBtbza9wWhCjw+jPQOwh17rvpOdUj0QppHoDRdeeHwXrjCntzvB7IBs0si7wIDAQAB-----END PUBLIC KEY-----";
// 获取私钥,用于解密数据的,千万不能泄露,否则数据不安全
NSString *privateKey = @"-----BEGIN PRIVATE KEY-----MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAK41fwnQ1nWO8jJ/OGCBr/b7j91Sqo3XmKNZWZZbGl/N2mHVobdSUfdJ8+mWB95K48FlSiQPpZbvQtJAqBt3viNzPkagFc3jRbEZNd8/mxNtxCozlQG1vNr3BaEKPD6M9A7CHXuu+k51SPRCmkegNF154fBeuMKe3O8HsgGzSyLvAgMBAAECgYBfk9IjHITM8qRGuC3CJOTZ6KLBlr0kHQkNddQE/e62aUZLLt4Oqgd2WQiNO1cNyqCyVlQa/MqoyJQsrnSMvWF/Qcj8Mk0XuMVDO0fhGGRG6x4EuimOzTSP2NGQdWnK9FgyTXPS6+PK4qUoXgOfZaqzAZFlBrWcw3/Zfyav6pf24QJBANi5mULelXb5SqJ3Gt2B929uqNwv2QyGc8BUZ9z/voxtgIhamYqsQ1fsqbfnqS7dTAM7K/pbjkSqDKfkR/hhtxsCQQDNx3m1NRk5mS4oEDcRNQ1qmv7ntjQ0Mh+xQcZiVYfY3CyAZzS70tnUBrCIKcQckihqdZ8502WrpSLNKaJ7YBy9AkEAnKbTFBWlfcDF5NcosRG/U2luXvGq9rW8tzmLdZ/aENEZxfWO5ECN0OD88DRgAsLsra04pZdGJ3Wu/jAwoWWoHwJAGNYopGxiPQd2ALPkUZlbozBN792X82zRUm2j6h50pQH+BQlv3fOXAvZDvEt+NgyWADNuImaXcN4fky+hQs7Y6QJAHYJBSAxmWekp3+v5rpkOIj3Uf55wL9O8ECax9E/HZqeEhczjg+h9dhJ6FwsfuiycOO32hQoWwxvKOgapTLwpGA==-----END PRIVATE KEY-----"; // 创建字符串
NSString *testStr = @"小暖心";
// 创建存储公钥的字符串
NSString *encPublicKey;
// 创建存储私钥的字符串
NSString *encPrivateKey;
// 使用RSA进行加密处理
// 参数1:需要加密的内容
// 参数2:公钥字符串
encPublicKey = [RSA encryptString:testStr publicKey:publicKey];
NSLog(@"public = %@", encPublicKey);
// 解密处理
// 第一个参数:由java后台提供
// 第二个参数:私钥字符串
NSString *result = @"p/hm1SvJm9SuuPy66rrf37+EhynkpVnCxbSCZfKznrAKVfpciX/TZM9GfLrAs+bXlND+GeOeZDz2zm+nZDtxpGV1pyQY03hOWn1MQ2+wBKKQdveEdYJ4TVXwGtC3PMaA3dwdRY+WqInQj9WX4JfuQfkYCqbmI0w86uydjFpenwE="; // 进过加密之后需要把加密的内容传送给后台,此时后台会给你返回一个相对应的字符串
encPrivateKey = [RSA decryptString:result privateKey:privateKey];
NSLog(@"private = %@", encPrivateKey); }
在服务器端解码数据(Java)
在Java中解码需要使用下述指令生成的pkcs8 private key:
具体解码步骤:
- 加载pkcs8 private key:
- 读取private key文件
- 去掉private key头尾的"-----BEGIN PRIVATE KEY-----"和"-----BEGIN PRIVATE KEY-----"
- 删除private key中的换行
- 对处理后的数据进行Base64解码
- 使用解码后的数据生成private key.
- 解密数据:
- 对数据进行Base64解码
- 使用RSA decrypt数据.
总结
这种加密传输方式会被用在网银类App中.虽然网银会采用全站https方案, 但是在安全登录这块会使用另一个证书对登录信息加密, 这样可以双层确保数据安全.
基于RSA加密解密算法, 还可以将其运用在数字签名场景.以后有空在聊如何使用RSA算法实现对文件的数字签名.
UI 公钥加密的更多相关文章
- UI进阶 数据加密
一.数据安全 在互联网发展趋势迅猛的今天,数据安全的重要性日趋凸显.也成为我们必须了解的互联网知识.在移动互联网浪潮下,用户的资金安全.企业的信息安全都是我们实际开发中必须考虑的内容.
- 避免重复造轮子的UI自动化测试框架开发
一懒起来就好久没更新文章了,其实懒也还是因为忙,今年上半年的加班赶上了去年一年的加班,加班不息啊,好了吐槽完就写写一直打算继续的自动化开发 目前各种UI测试框架层出不穷,但是万变不离其宗,驱动PC浏览 ...
- jQuery UI resizable使用注意事项、实时等比例拉伸及你不知道的技巧
这篇文章总结的是我在使用resizable插件的过程中,遇到的问题及变通应用的奇思妙想. 一.resizable使用注意事项 以下是我在jsfiddle上写的测试demo:http://jsfiddl ...
- “四核”驱动的“三维”导航 -- 淘宝新UI(需求分析篇)
前言 孔子说:"软件是对客观世界的抽象". 首先声明,这里的"三维导航"和地图没一毛钱关系,"四核驱动"和硬件也没关系,而是为了复杂的应用而 ...
- ABP框架 - Swagger UI 集成
文档目录 本节内容: 简介 Asp.net Core 安装 安装Nuget包 配置 测试 Asp.net 5.x 安装 安装Nuget包 配置 测试 简介 来自它的网页:“...使用一个Swagger ...
- 06.LoT.UI 前后台通用框架分解系列之——浮夸的图片上传
LOT.UI分解系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#lotui LoT.UI开源地址如下:https://github.com/du ...
- 07.LoT.UI 前后台通用框架分解系列之——强大的文本编辑器
LOT.UI分解系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#lotui LoT.UI开源地址如下:https://github.com/du ...
- 01.LoT.UI 前后台通用框架分解系列之——小图片背景全屏显示(可自动切换背景)
LOT.UI分解系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#lotui LoT.UI开源地址如下:https://github.com/du ...
- 02.LoT.UI 前后台通用框架分解系列之——灵活的菜单栏
LOT.UI分解系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#lotui LoT.UI开源地址如下:https://github.com/du ...
随机推荐
- 不是技术牛人,如何拿到国内IT巨头的Offer(1)
转自:http://developer.51cto.com/art/201404/436685.htm 不久前,byvoid面阿里星计划的面试结果截图泄漏,引起无数IT屌丝的羡慕敬仰.看看这些牛人,N ...
- SQL Server索引进阶:第十级,索引内部结构
原文地址: Stairway to SQL Server Indexes: Level 10,Index Internal Structure 本文是SQL Server索引进阶系列(Stairway ...
- Linux Shell 学习笔记 一 目录结构
以Red Hat Enterprise Linux 各版本为例,RHEL中目录具体作用如下, /bin 存放普通用户使用的命令 /sbin 存放管理员可以执行的命令 /home ...
- iOS 发布应用时屏蔽NSLog
在开发过程中,经常需要使用NSLog来进行调试,但是NSLog是非常影响性能的,所以我们应该在发布应用时屏蔽掉NSLog,但是如果通过手工的去一行一行的改得话,未免太枯燥与费时了,庆幸的是,我们可以通 ...
- Set 与 Multiset
Set 与 Multiset 会根据待定的排序准则,自动将元素排序,两者不同之处在于前者不允许元素重复,后者允许,下面介绍一下set中的函数: 一.set 中的 begin.end.rbegin.re ...
- BZOJ 1016: [JSOI2008]最小生成树计数( kruskal + dfs )
不同最小生成树中权值相同的边数量是一定的, 而且他们对连通性的贡献是一样的.对权值相同的边放在一起(至多10), 暴搜他们有多少种方案, 然后乘法原理. ----------------------- ...
- 理解Ajax
1.优化原则 优化的目的是希望降低程序的整体开销.虽然在程序中有许多因素可以优化,但是通常人们会认为这个开销就是程序的执行时间.其实我们更应该把重点放在对程序整体开销最大的那部分. 2.一切都是权 ...
- 前端笔试题2 JS部分
笔试题2 var EventME = {}; EventME.addHandle = function(ele, eventName, handleFunction) { if (ele.addEve ...
- javascript Node操作
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- PC游戏编程(入门篇)(前言写的很不错)
PC游戏编程(入门篇) 第一章 基石 1. 1 BOSS登场--GAF简介 第二章 2D图形程式初体验 2.l 饮水思源--第一个"游戏"程式 2.2 知其所以然一一2D图形学基础 ...