Android 常用的数据加密方式

前言

Android 很多场合需要使用到数据加密,比如:本地登录密码加密,网络传输数据加密,等。在android 中一般的加密方式有如下:

  1. 亦或加密
  2. AES加密
  3. RSA非对称加密

当然还有其他的方式,这里暂且介绍以上三种加密算法的使用方式。

亦或加密算法

什么是亦或加密?

  • 亦或加密是对某个字节进行亦或运算,比如字节 A^K = V,这是加密过程;
  • 当你把 V^K得到的结果就是A,也就是 V^K = A,这是一个反向操作过程,解密过程。
  • 亦或操作效率很高,当然亦或加密也是比较简单的加密方式,且亦或操作不会增加空间,源数据多大亦或加密后数据依然是多大。

示例代码如下:

/*** 亦或加解密,适合对整个文件的部分加密,比如文件头部,和尾部* 对file文件头部和尾部加密,适合zip压缩包加密** @param source 需要加密的文件* @param det    加密后保存文件名* @param key    加密key*/public static void encryptionFile(File source, File det, int key) { FileInputStream fis = null; FileOutputStream fos = null; try { fis = new FileInputStream(source); fos = new FileOutputStream(det); int size = 2048; byte buff[] = new byte[size]; int count = fis.read(buff); /**zip包头部加密*/ for (int i = 0; i < count; i++) { fos.write(buff[i] ^ key); } while (true) { count = fis.read(buff); /**zip包结尾加密*/ if (count < size) { for (int j = 0; j < count; j++) { fos.write(buff[j] ^ key); } break; } fos.write(buff, 0, count); } fos.flush(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (fis != null) { fis.close(); } if (fos != null) { fos.close(); } } catch (IOException e) { e.printStackTrace(); } } } /** * 亦或加解密,适合对整个文件加密 * * @param source 需要加密文件的路径 * @param det 加密后保存文件的路径 * @param key 加密秘钥key */ private static void encryptionFile(String source, String det, int key) { FileInputStream fis = null; FileOutputStream fos = null; try { fis = new FileInputStream(source); fos = new FileOutputStream(det); int read; while ((read = fis.read()) != -1) { fos.write(read ^ key); } fos.flush(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (fis != null) { fis.close(); } if (fos != null) { fos.close(); } } catch (IOException e) { e.printStackTrace(); } } }

 

总结:

  1. 可以对文件的部分加密,比如zip压缩包,就可以对头部和尾部加密,因为zip头部和尾部藏有文件压缩相关的信息,所有,我们只对头部和尾部采用亦或加密算法,即可对整个zip文件加密,当你不解密试图加压是会失败的。
  2. 也可以对整个文件进行亦或加密算法,所以你解密的时候其实是一个逆向的过程,使用同样的方法同样的key即可对加密的文件解密。当然以后加密的安全性可想而知,不是很安全,所以,亦或加密算法一般使用在不太重要的场景。由于亦或算法很快,所以加密速度也很快。

AES加密加密算法

什么是AES 加密

  • AES 对称加密
  • 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。 这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。
  • Android 中的AES 加密 秘钥 key 必须为16/24/32位字节,否则抛异常

示例代码:

  private static final String TAG = "EncryptUtils";private final static int MODE_ENCRYPTION = 1; private final static int MODE_DECRYPTION = 2; private final static String AES_KEY = "xjp_12345!^-=42#";//AES 秘钥key,必须为16位 private static byte[] encryption(int mode, byte[] content, String pwd) { try { Cipher cipher = Cipher.getInstance("AES/CFB/NoPadding");//AES加密模式,CFB 加密模式 SecretKeySpec keySpec = new SecretKeySpec(pwd.getBytes("UTF-8"), "AES");//AES加密方式 IvParameterSpec ivSpec = new IvParameterSpec(pwd.getBytes("UTF-8")); cipher.init(mode == MODE_ENCRYPTION ? Cipher.ENCRYPT_MODE : Cipher.DECRYPT_MODE, keySpec, ivSpec); return cipher.doFinal(content); } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException | InvalidAlgorithmParameterException e) { e.printStackTrace(); Log.e(TAG, "encryption failed... err: " + e.getMessage()); } catch (Exception e) { e.printStackTrace(); Log.e(TAG, "encryption1 failed ...err: " + e.getMessage()); } return null; } /** * AES 加密 * * @param source 需要加密的文件路径 * @param dest 加密后的文件路径 */ public static void encryptByAES(String source, String dest) { encryptByAES(MODE_ENCRYPTION, source, dest); } public static void encryptByAES(int mode, String source, String dest) { Log.i(TAG, "start===encryptByAES"); FileInputStream fis = null; FileOutputStream fos = null; try { fis = new FileInputStream(source); fos = new FileOutputStream(dest); int size = 2048; byte buff[] = new byte[size]; byte buffResult[]; while ((fis.read(buff)) != -1) { buffResult = encryption(mode, buff, AES_KEY); if (buffResult != null) { fos.write(buffResult); } } Log.i(TAG, "end===encryptByAES"); } catch (IOException e) { e.printStackTrace(); Log.e(TAG, "encryptByAES failed err: " + e.getMessage()); } finally { try { if (fis != null) { fis.close(); } if (fos != null) { fos.close(); } } catch (IOException e) { e.printStackTrace(); } } } /** * AES 解密 * * @param source 需要解密的文件路径 * @param dest 解密后保存的文件路径 */ public static void decryptByAES(String source, String dest) { encryptByAES(MODE_DECRYPTION, source, dest); } 

 

总结:
AES对称加密,加解密相比于亦或加密还是有点复杂的,安全性也比亦或加密高,AES加密不是绝对的安全。

RSA非对称加密

什么是Rsa加密?

RSA算法是最流行的公钥密码算法,使用长度可以变化的密钥。RSA是第一个既能用于数据加密也能用于数字签名的算法。

RSA的安全性依赖于大数分解,小于1024位的N已经被证明是不安全的,而且由于RSA算法进行的都是大数计算,使得RSA最快的情况也比DES慢上倍,这是RSA最大的缺陷,因此通常只能用于加密少量数据或者加密密钥,但RSA仍然不失为一种高强度的算法。

代码示例:

 /*************************************************** 1.什么是RSA 非对称加密?* <p>* 2.*************************************************/private final static String RSA = "RSA"; //加密方式 RSA public final static int DEFAULT_KEY_SIZE = 1024; private final static int DECRYPT_LEN = DEFAULT_KEY_SIZE / 8;//解密长度 private final static int ENCRYPT_LEN = DECRYPT_LEN - 11;//加密长度 private static final String DES_CBC_PKCS5PAD = "DES/CBC/PKCS5Padding";//加密填充方式 private final static int MODE_PRIVATE = 1;//私钥加密 private final static int MODE_PUBLIC = 2;//公钥加密 /** * 随机生成RSA密钥对,包括PublicKey,PrivateKey * * @param keyLength 秘钥长度,范围是 512~2048,一般是1024 * @return KeyPair */ public static KeyPair generateRSAKeyPair(int keyLength) { try { KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); kpg.initialize(keyLength); return kpg.genKeyPair(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); return null; } } /** * 得到私钥 * * @return PrivateKey * @throws NoSuchAlgorithmException * @throws InvalidKeySpecException */ public static PrivateKey getPrivateKey(String key) throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchProviderException { byte[] privateKey = Base64.decode(key, Base64.URL_SAFE); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKey); KeyFactory kf = KeyFactory.getInstance(RSA); return kf.generatePrivate(keySpec); } /** * 得到公钥 * * @param key * @return PublicKey * @throws NoSuchAlgorithmException * @throws InvalidKeySpecException */ public static PublicKey getPublicKey(String key) throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchProviderException { byte[] publicKey = Base64.decode(key, Base64.URL_SAFE); X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKey); KeyFactory kf = KeyFactory.getInstance(RSA); return kf.generatePublic(keySpec); } /** * 私钥加密 * * @param data * @param key * @return * @throws Exception */ public static byte[] encryptByRSA(byte[] data, Key key) throws Exception { // 数据加密 Cipher cipher = Cipher.getInstance(RSA); cipher.init(Cipher.ENCRYPT_MODE, key); return cipher.doFinal(data); } /** * 公钥解密 * * @param data 待解密数据 * @param key 密钥 * @return byte[] 解密数据 */ public static byte[] decryptByRSA(byte[] data, Key key) throws Exception { // 数据解密 Cipher cipher = Cipher.getInstance(RSA); cipher.init(Cipher.DECRYPT_MODE, key); return cipher.doFinal(data); } public static void encryptByRSA(String source, String dest, Key key) { rasEncrypt(MODE_ENCRYPTION, source, dest, key); } public static void decryptByRSA(String source, String dest, Key key) { rasEncrypt(MODE_DECRYPTION, source, dest, key); } public static void rasEncrypt(int mode, String source, String dest, Key key) { Log.i(TAG, "start===encryptByRSA mode--->>" + mode); FileInputStream fis = null; FileOutputStream fos = null; try { fis = new FileInputStream(source); fos = new FileOutputStream(dest); int size = mode == MODE_ENCRYPTION ? ENCRYPT_LEN : DECRYPT_LEN; byte buff[] = new byte[size]; byte buffResult[]; while ((fis.read(buff)) != -1) { buffResult = mode == MODE_ENCRYPTION ? encryptByRSA(buff, key) : decryptByRSA(buff, key); if (buffResult != null) { fos.write(buffResult); } } Log.i(TAG, "end===encryptByRSA"); } catch (IOException e) { e.printStackTrace(); Log.e(TAG, "encryptByRSA failed err: " + e.getMessage()); } catch (Exception e) { e.printStackTrace(); } finally { try { if (fis != null) { fis.close(); } if (fos != null) { fos.close(); } } catch (IOException e) { e.printStackTrace(); } } }

 

总结:
1.AES公钥加密,私钥解密
2.AES加密耗时
3.AES加密后数据会变大

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/537856.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle可以注入吗,ORACLE 注入

1判断是什么数据库and exist(select * from dual)and exists(select * from user_tables)原理&#xff1a;dual表和user_tables表是oracle中的系统表返回正常&#xff0c;那么就可以肯定这是oracle。2查字段数order by 10-- //错误,列数小于10order by 3-- //正常,列数等于…

centos升级glibc(升级到 2.17版)

1、原先的系统glibc库的版本是2.12&#xff0c;需要升级到2.17版本。 下载地址&#xff1a; http://ftp.gnu.org/gnu/glibc/ http://ftp.gnu.org/gnu/glibc/glibc-2.17.tar.gz 这里可以选择你所需要的版本。 2、安装部署 [rootkafzook1 common]# tar -xf glibc-2.17.tar.g…

Day31 python基础--网络编程基础-socketserver

一&#xff0c;验证客户端合法性 #server端 import os import hmac import socket secret_key balex_sbdef auth(conn):msg os.urandom(32) #生成一个随机的字符串conn.send(msg) #发送到client端result hmac.new(secret_key,msg) #处理这个随机字符串&#xff0c;得到一…

康乐php一键脚本,kangle一键脚本

脚本简介1、本脚本是可以一键安装kangleEasypanelmysql商业集合脚本。2、脚本本身集成&#xff1a;PHP5.3、PHP5.4、PHP5.5、PHP5.6、PHP7.1、PHP7.2、PHP7.3、MYSQL5.63、支持前台用户任意切换PHP5.3-7.3以适应网站程序Kangle一键脚本特点1.安装包内PHP套件以及Kangle套件均已…

oracle data guard方案,Oracle Data Guard 概念篇

一个Data Guard 配置由一个生产库和一个或者多个standby数据库组成&#xff0c;在Data Guard配置中&#xff0c;主库和备库都既可以是rac环境&#xff0c;也可以是单机环境。这篇文章主要介绍dataguard的一些基本知识dataguard的分类、dataguard的服务类型、dataguard的保护模式…

洛谷P4133 [BJOI2012]最多的方案(记忆化搜索)

题意 题目链接 求出把$n$分解为斐波那契数的方案数&#xff0c;方案两两不同的定义是分解出来的数不完全相同 Sol 这种题&#xff0c;直接爆搜啊。。。 打表后不难发现$<1e18$的fib数只有88个 最先想到的应该是直接把$n$加入到搜索状态里&#xff0c;然后枚举能被分成哪些 但…

centos一键安装redmine

官网给出的环境要求&#xff1a; http://www.redmine.org/projects/redmine/wiki/RedmineInstall#Requirements ------------------------------------------------------------------------------------------------------------- 下载一键安装&#xff1a;&#xff08;下载…

大话php设计模式视频,大话PHP设计模式

工厂模式用工厂方法或者类来实例化对象&#xff0c;而不是直接new。首先我们需要创建一个工厂类&#xff0c;比如Factory.php。如果不使用工厂模式的&#xff0c;我们需要一个对象的时候通常需要new Inexistence\girlfriend();然而我们一般不只在一个地方需要这个对象&#xff…

Git 2.19 对Diff、Branch和Grep等做了改进

\Git的最新版带来了丰富的新功能以及内部更新&#xff0c;包括改进的diff、branch和grep&#xff0c;更好的命令行补全&#xff0c;新的range-diff命令等。\\Git diff现在可以正确地标记以intent-to-add参数添加的新文件路径。intent-to-add可以和git add命令一起使用&#xff…

su oracle c expdp,expdp/impdp 数据泵导入导出

useridtest/test --导出的用户&#xff0c;本地用户!!directorydmpfile --导出的逻辑目录&#xff0c;一定要在oracle中创建完成的&#xff0c;并且给用户授权读写权限dumpfilexx.dmp --导出的数据文件的名称&#xff0c;如果想在指定的位置的话可以写…

Centos 升级GLIBCXX3.4.25

32位系统: http://ftp.de.debian.org/debian/pool/main/g/gcc-4.7/libstdc6_4.7.2-5_i386.deb 64位系统: wget http://ftp.de.debian.org/debian/pool/main/g/gcc-8/libstdc6_8.2.0-7_amd64.deb 其他版本 http://ftp.de.debian.org/debian/pool/main/g/ 解压 ar -x libst…

美团点评基于MGR的CMDB高可用架构搭建之路【转】

王志朋 美团点评DBA 曾在京东金融担任DBA&#xff0c;目前就职于美团点评&#xff0c;主要负责金融业务线数据库及基础组件数据库的运维。 MySQL Group Replication&#xff08;以下简称MGR&#xff09;&#xff0c;于5.7.17版本正式GA&#xff0c;由Oracle官方出品&#xff0c…

使用 redmind 进行项目任务管理

一、项目经理 1.1、新建任务(工单) 1.2、查看任务状态 二、团队成员 2.1、查看任务 作为这个团队的成员之一&#xff0c;每天开工第一件事便是进入redmine查看“我的工作台”中自己的任务 2.2、每日反馈任务完成状态 1、每天开始工作时&#xff0c;及时将任务状态从“新…

oracle11g创建表空间大文件,oracle11g创建表空间 sql语法

--oracle 11g创建有限制大小的永久表空间--create tablespace test--datafile F:\app\shan\product\11.2.0\dbhome_1\oradata\test.dbf size 1M--autoextend on next 2M maxsize 1024M;--修改表空间大小&#xff1a;--alter database datafile F:\app\shan\product\11.2.0\dbho…

内存泄漏优化

目录介绍&#xff1a; 1.什么是内存泄漏2.内存泄漏造成什么影响3.内存泄漏检测的工具有哪些4.关于Leakcanary使用介绍5.Leakcanary捕捉常见的内存泄漏及解决办法 5.0.1 错误使用单例造成的内存泄漏5.0.2 错误使用静态变量&#xff0c;导致引用后无法销毁5.0.3 [常见]Handler使用…

redmine更换主题

主题列表&#xff1a;http://www.redmine.org/projects/redmine/wiki/Theme_List 虽然有很多主题&#xff0c;但是很多主题都是要钱的&#xff0c;像这类&#xff08;上图&#xff09;没有下载地址的&#xff0c;都是要钱的。 含GitHub的下载地址的&#xff0c;是免费可下载的&…

redmine 邮箱配置(阿里云+windows)

说明 密码是第三方的授权码&#xff0c;不是邮箱密码 需要登录126网页版&#xff0c;在设置里开启 smtp 等第三方服务&#xff0c;设置授权码 阿里云Linux 默认屏蔽25号端口&#xff0c;所以需要开启ssl&#xff0c;和使用 465 端口 重启下 redmind sh /opt/redmine-3.4.6-…

linux查看当前用户终端,Linux----基本命令的使用(vi命令,查看文件内容,显示进程,切换用户等)...

1、vi是linux系统上经常使用的一个文本编辑器&#xff0c;其有三种模式&#xff1a;命令模式、编辑模式(插入模式)、末行模式。命令模式——>编辑模式&#xff1a;“i a o I A O”linux编辑模式——>命令模式&#xff1a;“ESC”shell命令模式——>末行模式&#xff1…

centos6.8 环境一键安装包 nginx配置thinkphp5

---恢复内容开始--- lnmp1.4 一键安装包 nginx配置thinkphp5 环境&#xff1a;Nginx1.12.1 PHP5.6 Coentos6.8 修改网站配置文件 server{listen 443 ssl http2;#listen [::]:443 ssl http2;server_name xxx.cn;index index.html index.htm index.php default.html default.ht…

Linux下BitNami Redmine的插件安装与更新

截至2017年3月27日&#xff0c;Redmine-3.3.2-2安装以下的15款插件全部成功并通过测试&#xff08;下面显示为插件正确文件夹名&#xff09;&#xff1a; easy_wbs redmine_ckeditor 提供所见即所得编辑器 redmine_graphs 提供部分问题图表功能 progressive_projects_list 是…