zoukankan      html  css  js  c++  java
  • RSA非对称加密,使用OpenSSL生成证书,iOS加密,java解密

    最近换了一份工作,工作了大概一个多月了吧。差不多得有两个月没有更新博客了吧。在新公司自己写了一个iOS的比较通用的可以架构一个中型应用的不算是框架的一个结构,并已经投入使用。哈哈

    说说文章标题的相关的内容吧

    很多对安全要求比较高的应用都要使用加密,加密后与后端沟通数据,这样能防止被别人截获数据包,直接把接口的参数数据暴露。我上一家公司是做P2P互联网金融的,就使用了多种加密方式,有对称的也有非对称的。最近新公司的APP也有意向使用加密,思考了一下,最成熟的解决方案就是使用RSA非对称的加密了。就不介绍非对称加密是怎么回事了,不了解的自行Google或者bing。生成公钥私钥证书我使用的是OpenSSL的解决方案,没错,就是老罗捐了几次款,爆出过心脏滴血漏洞的OpenSSL。

    先说说证书的生成吧,我使用的是MAC,上面自带了OpenSSL,当然我删除了,又用HomeBrew安装了一个较新的版本。又看了下Linux上也自带了openssl,windows上没有,可以去官网下载安装

    1.终端输入openssl,进入openssl状态

    2.生成一个1024位的私钥:genrsa -out rsa_private_key.pem 1024

    3.利用私钥生成JAVA支持的PKCS8类型的私钥:pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out pkcs8_private_key.pem

    4.生成JAVA支持的PKCS8二进制类型的私钥:pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform DER -nocrypt -out pkcs8_private_key.der

    5.生成公钥:rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

    6.生成iOS支持的der证书,其间用到了证书请求和自签署根证书

      6.1.创建证书请求:req -new -out cert.csr -key rsa_private_key.pem  (其间会要求填写国家地区公司信息等,随便填写OR认真填写都不影响证书使用)

      6.2.创建X509的自签署跟证书(iOS支持X509,有效期3650天):x509 -req -in cert.csr -out rsa_public_key.der -outform der -signkey rsa_private_key.pem -days 3650

    完成了以上的步骤后应该在你所在的目录下生成了6个文件,其中pem的文件都是文本类型的,都可以使用文本编辑器或者cat命令查看。der的都是二进制的文件了,看不了。

    以上的都完了,推荐打开github的链接,一个不认识的人写的,里面包含了java端和iOS的实现方式。https://github.com/BabyDuncan/RSA_OC_JAVA

    但是有两点是需要注意的:

    1.java那个使用公钥的部分,应该使用上述的第4步生成的 pkcs8_private_key.der 文件,不要眼花啊

    2.OC中在bundle中找不到der类型的文件,需要改一下上述6.2生成的 rsa_public_key.der 文件的后缀为 .cer 才可以。

    完成上述的操作后就可以正常的使用了。

    插播一句:如果在java中想使用 pkcs8_private_key.pem 文件的话,请自行把那段代码,没错就是那段代码(至于到底是哪段,自己找)替换成下面的这段

    1            byte[] privateKeyData = Files.readAllBytes(
    2                     Paths.get("/Users/ald1/Documents/workspace/aaa/src/pkcs8_private_key.pem"));
    3             byte[] decodedKeyData = Base64.decodeBase64(new String(privateKeyData)
    4                       .replaceAll("-----\w+ PRIVATE KEY-----", "")
    5                       .replace("
    ", ""));
    6                   KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    7             EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(decodedKeyData);

    当然,文件的路径自行脑补。

    再附送几个调研此次成果的链接,可能相关性不是很大,看下就好

    OpenSSL的官网帮助:http://openssl.org/docs/manmaster/apps/rsa.html

    iOS的获取公钥私钥:http://codego.net/455876/

    证书转换:https://www.sslshopper.com/ssl-converter.html

    随意看看会有帮助的文章:http://blog.csdn.net/as3luyuan123/article/details/16105435

                http://witcheryne.iteye.com/blog/2171850

                http://blog.chinaunix.net/uid-26729093-id-4449165.html

    好了就到这吧。

  • 相关阅读:
    【mybatis源码学习】缓存机制
    【maven】命令
    【传输协议】thrift的IDL语法
    【传输协议】thrift原理
    Go 语言极速入门
    SOFABolt 源码分析
    !!!后续博客写到简书 + 博客园留博客目录
    第一章 java nio三大组件与使用姿势
    netty源码解析目录
    mac下host配置 + mac修改了环境变量却不生效:zsh: command not found: xxx
  • 原文地址:https://www.cnblogs.com/ysk-china/p/4769270.html
Copyright © 2011-2022 走看看