移动APP接口是怎么保证安全性的,可以采用https,或者是非对称加密。

接口加密的目的是防止被别人用抓包工具,抓包后篡改数据。

关于加密算法常见的有对称加密(DES)和非对称加密(RSA)

对称加密(DES):加密和解密用的是同一个密钥

  1. import java.security.SecureRandom;
  2. import javax.crypto.Cipher;
  3. import javax.crypto.SecretKey;
  4. import javax.crypto.SecretKeyFactory;
  5. import javax.crypto.spec.DESKeySpec;
  6.  
  7. /**
  8. * DES加密介绍 DES是一种对称加密算法,所谓对称加密算法即:加密和解密使用相同密钥的算法。DES加密算法出自IBM的研究,
  9. */
  10. public class DES {
  11. public DES() {
  12. }
  13.  
  14. // 测试
  15. public static void main(String args[]) throws Exception {
  16. // 待加密内容
  17. String str = "irish";
  18. // 密码,长度要是8的倍数 密钥随意定
  19. String password = "";
  20. byte[] encrypt = encrypt(str.getBytes(), password);
  21. System.out.println("加密后:" + new String(encrypt));
  22. // 解密
  23. byte[] decrypt = decrypt(encrypt, password);
  24. System.out.println("解密后:" + new String(decrypt));
  25. }
  26.  
  27. /**
  28. * 加密
  29. *
  30. * @param datasource byte[]
  31. * @param password String
  32. * @return byte[]
  33. */
  34. public static byte[] encrypt(byte[] datasource, String password) {
  35. try {
  36. SecureRandom random = new SecureRandom();
  37. DESKeySpec desKey = new DESKeySpec(password.getBytes());
  38. // 创建一个密匙工厂,然后用它把DESKeySpec转换成
  39. SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
  40. SecretKey securekey = keyFactory.generateSecret(desKey);
  41. // Cipher对象实际完成加密操作
  42. Cipher cipher = Cipher.getInstance("DES");
  43. // 用密匙初始化Cipher对象,ENCRYPT_MODE用于将 Cipher 初始化为加密模式的常量
  44. cipher.init(Cipher.ENCRYPT_MODE, securekey, random);
  45. // 现在,获取数据并加密
  46. // 正式执行加密操作
  47. return cipher.doFinal(datasource); // 按单部分操作加密或解密数据,或者结束一个多部分操作
  48. } catch (Throwable e) {
  49. e.printStackTrace();
  50. }
  51. return null;
  52. }
  53.  
  54. /**
  55. * 解密
  56. *
  57. * @param src byte[]
  58. * @param password String
  59. * @return byte[]
  60. * @throws Exception
  61. */
  62. public static byte[] decrypt(byte[] src, String password) throws Exception {
  63. // DES算法要求有一个可信任的随机数源
  64. SecureRandom random = new SecureRandom();
  65. // 创建一个DESKeySpec对象
  66. DESKeySpec desKey = new DESKeySpec(password.getBytes());
  67. // 创建一个密匙工厂
  68. SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");// 返回实现指定转换的
  69. // 将DESKeySpec对象转换成SecretKey对象
  70. SecretKey securekey = keyFactory.generateSecret(desKey);
  71. // Cipher对象实际完成解密操作
  72. Cipher cipher = Cipher.getInstance("DES");
  73. // 用密匙初始化Cipher对象
  74. cipher.init(Cipher.DECRYPT_MODE, securekey, random);
  75. // 真正开始解密操作
  76. return cipher.doFinal(src);
  77. }
  78. }

非对称加密RSA(RSA是他们的发明人的姓氏开头字母拼在一起组成的)

采用第三方工具生成一对密钥对(公钥和私钥)

加密方式分为两种:

1如果用公钥加密,必须采用私钥解密

2如果用私钥加密,必须采用公钥解密

移动APP接口采用RSA加密的话,移动APP保存公钥,服务器端保存私钥

  1. import java.security.KeyFactory;
  2. import java.security.KeyPair;
  3. import java.security.KeyPairGenerator;
  4. import java.security.NoSuchAlgorithmException;
  5. import java.security.PrivateKey;
  6. import java.security.PublicKey;
  7. import java.security.SecureRandom;
  8. import java.security.interfaces.RSAPrivateKey;
  9. import java.security.interfaces.RSAPublicKey;
  10. import java.security.spec.PKCS8EncodedKeySpec;
  11. import java.security.spec.X509EncodedKeySpec;
  12.  
  13. import javax.crypto.Cipher;
  14.  
  15. import org.apache.commons.codec.binary.Base64;
  16.  
  17. /**
  18. * RSA加解密工具类
  19. *
  20. *
  21. */
  22. public class RSAUtil {
  23.  
  24. public static String publicKey; // 公钥
  25. public static String privateKey; // 私钥
  26.  
  27. /**
  28. * 生成公钥和私钥
  29. */
  30. public static void generateKey() {
  31. // 1.初始化秘钥
  32. KeyPairGenerator keyPairGenerator;
  33. try {
  34. keyPairGenerator = KeyPairGenerator.getInstance("RSA");
  35. SecureRandom sr = new SecureRandom(); // 随机数生成器
  36. keyPairGenerator.initialize(, sr); // 设置512位长的秘钥
  37. KeyPair keyPair = keyPairGenerator.generateKeyPair(); // 开始创建
  38. RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();
  39. RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();
  40. // 进行转码
  41. publicKey = Base64.encodeBase64String(rsaPublicKey.getEncoded());
  42. // 进行转码
  43. privateKey = Base64.encodeBase64String(rsaPrivateKey.getEncoded());
  44. } catch (NoSuchAlgorithmException e) {
  45. // TODO Auto-generated catch block
  46. e.printStackTrace();
  47. }
  48. }
  49.  
  50. /**
  51. * 私钥匙加密或解密
  52. *
  53. * @param content
  54. * @param privateKeyStr
  55. * @return
  56. */
  57. public static String encryptByprivateKey(String content, String privateKeyStr, int opmode) {
  58. // 私钥要用PKCS8进行处理
  59. PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKeyStr));
  60. KeyFactory keyFactory;
  61. PrivateKey privateKey;
  62. Cipher cipher;
  63. byte[] result;
  64. String text = null;
  65. try {
  66. keyFactory = KeyFactory.getInstance("RSA");
  67. // 还原Key对象
  68. privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
  69. cipher = Cipher.getInstance("RSA");
  70. cipher.init(opmode, privateKey);
  71. if (opmode == Cipher.ENCRYPT_MODE) { // 加密
  72. result = cipher.doFinal(content.getBytes());
  73. text = Base64.encodeBase64String(result);
  74. } else if (opmode == Cipher.DECRYPT_MODE) { // 解密
  75. result = cipher.doFinal(Base64.decodeBase64(content));
  76. text = new String(result, "UTF-8");
  77. }
  78.  
  79. } catch (Exception e) {
  80. // TODO Auto-generated catch block
  81. e.printStackTrace();
  82. }
  83. return text;
  84. }
  85.  
  86. /**
  87. * 公钥匙加密或解密
  88. *
  89. * @param content
  90. * @param privateKeyStr
  91. * @return
  92. */
  93. public static String encryptByPublicKey(String content, String publicKeyStr, int opmode) {
  94. // 公钥要用X509进行处理
  95. X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(Base64.decodeBase64(publicKeyStr));
  96. KeyFactory keyFactory;
  97. PublicKey publicKey;
  98. Cipher cipher;
  99. byte[] result;
  100. String text = null;
  101. try {
  102. keyFactory = KeyFactory.getInstance("RSA");
  103. // 还原Key对象
  104. publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
  105. cipher = Cipher.getInstance("RSA");
  106. cipher.init(opmode, publicKey);
  107. if (opmode == Cipher.ENCRYPT_MODE) { // 加密
  108. result = cipher.doFinal(content.getBytes());
  109. text = Base64.encodeBase64String(result);
  110. } else if (opmode == Cipher.DECRYPT_MODE) { // 解密
  111. result = cipher.doFinal(Base64.decodeBase64(content));
  112. text = new String(result, "UTF-8");
  113. }
  114. } catch (Exception e) {
  115. // TODO Auto-generated catch block
  116. e.printStackTrace();
  117. }
  118. return text;
  119. }
  120.  
  121. public static void main(String[] args) {
  122.  
  123. // 1. 生成(公钥和私钥)密钥对
  124. RSAUtil.generateKey();
  125. System.out.println("公钥:" + RSAUtil.publicKey);
  126. System.out.println("私钥:" + RSAUtil.privateKey);
  127. System.out.println("----------公钥加密私钥解密-------------");
  128. // 使用 公钥加密,私钥解密
  129. String textsr = "irish";
  130. String encryptByPublic = RSAUtil.encryptByPublicKey(textsr, RSAUtil.publicKey, Cipher.ENCRYPT_MODE);
  131. System.out.println("公钥加密:" + encryptByPublic);
  132. String text = RSAUtil.encryptByprivateKey(encryptByPublic, RSAUtil.privateKey, Cipher.DECRYPT_MODE);
  133. System.out.print("私钥解密:" + text);
  134. }
  135.  
  136. }

移动APP接口安全性设计的更多相关文章

  1. 基于Java的REST架构风格及接口安全性设计的讨论

    1.REST即表现层状态传递(Representational [,rɛprɪzɛn'teʃnl] State Transfer,简称REST). (1)REST名词解释: 通俗来讲就是资源在网络中以 ...

  2. API接口安全性设计

    http://www.jianshu.com/p/c6518a8f4040 接口的安全性主要围绕Token.Timestamp和Sign三个机制展开设计,保证接口的数据不会被篡改和重复调用,下面具体来 ...

  3. Java++:安全|API接口安全性设计

    接口的安全性主要围绕 token.timestamp 和 sign 三个机制展开设计,保证接口的数据不会被篡改和重复调用,下面具体来看: Token授权机制: 用户使用用户名密码登录后服务器给客户端返 ...

  4. 【转】App架构设计经验谈:接口的设计

    App架构设计经验谈:接口的设计 App与服务器的通信接口如何设计得好,需要考虑的地方挺多的,在此根据我的一些经验做一些总结分享,旨在抛砖引玉. 安全机制的设计 现在,大部分App的接口都采用REST ...

  5. App接口设计

    关于APP接口设计 http://blog.csdn.net/gebitan505/article/details/37924711/

  6. PHP做APP接口时,如何保证接口的安全性??????????

    PHP做APP接口时,如何保证接口的安全性? 1.当用户登录APP时,使用https协议调用后台相关接口,服务器端根据用户名和密码时生成一个access_key,并将access_key保存在sess ...

  7. App版本更新接口的设计

    前段时间公司业务调整,新开了新的移动端的项目,所以和朋友聊到了“版本号”和“版本更新所需的数据表设计”. 一般来讲大部分的软件版本号分3段,比如 A.B.C A 表示大版本号,一般当软件整体重写,或出 ...

  8. 关于APP接口设计(转)

    最近一段时间一直在做APP接口,总结一下APP接口开发过程中的注意事项: 1.效率:接口访问速度 APP有别于WEB服务,对服务器端要求是比较严格的,在移动端有限的带宽条件下,要求接口响应速度要快,所 ...

  9. 关于APP接口设计

    最近一段时间一直在做APP接口,总结一下APP接口开发过程中的注意事项: 1.效率:接口访问速度 APP有别于WEB服务,对服务器端要求是比较严格的,在移动端有限的带宽条件下,要求接口响应速度要快,所 ...

随机推荐

  1. Frightful Formula Gym - 101480F (待定系数法)

    Problem F: Frightful Formula \[ Time Limit: 10 s \quad Memory Limit: 512 MiB \] 题意 题意就是存在一个\(n*n\)的矩 ...

  2. 014_matlab读取ecxel(直接导入)

    视频教程:https://v.qq.com/x/page/c3039b5htwx.html 资料下载:https://download.csdn.net/download/xiaoguoge11/12 ...

  3. 利用python画小猪佩奇

    import turtle as t t.pensize(4) t.hideturtle() t.colormode(255) t.color((255,155,192),"pink&quo ...

  4. yugabyte 安装pg extention

    前段时间在学习yugabyte 发现yugabyte 是直接复用了pg server的源码,所以当时就觉得大部分pg extension 也是可用. 今天看到了官方文档中有关于如何安装的,发现还得多看 ...

  5. 洛谷P2949题解

    若想要深入学习反悔贪心,传送门. Description: 有 \(n\) 项工作,每 \(i\) 项工作有一个截止时间 \(D_i\) ,完成每项工作可以得到利润 \(P_i\) ,求最大可以得到多 ...

  6. 【POJ1416】Shredding Company

    本题传送门 本题知识点:深度优先搜索 + 回溯 本题题意很简单,就是有一条位数不超过6的数字纸条,问你怎么剪这纸条,使得得到的纸条的值的总和最接近目标值(总和不能超过目标值). 比如第一个样例 50 ...

  7. 第08组 Alpha冲刺(6/6)

    队名:955 组长博客:https://www.cnblogs.com/cclong/p/11913269.html 作业博客:https://edu.cnblogs.com/campus/fzu/S ...

  8. html 选择本地图片,显示选择的图片

    主要用的是html5的文件系统部分: <html> <head> <meta name="viewport" content="width= ...

  9. E4A碰到打开自动闪退又自动打开又闪退一直循环的问题

    E4A碰到打开自动闪退又自动打开又闪退一直循环的问题 这几天写了一个脚本,自己手机上,模拟器上,均测试没有问题,可以正常操作 发给另一个人,他那边居然没有一个设备能运行成功! 而且一直闪退,闪退后又打 ...

  10. [Beta]Scrum Meeting#8

    github 本次会议项目由PM召开,时间为5月13日晚上10点30分 时长10分钟 任务表格 人员 昨日工作 下一步工作 木鬼 撰写博客整理文档 撰写博客整理文档 swoip 为适应新功能调整布局 ...