Android数据加密解密
最近项目在维护过程中,估计这一周都会没有什么事情做了。于是开始打量自己做完的这个项目,项目在展示方面乏善可陈,然后仔细的想了想,这个项目的亮点无非就在数据加密和解密这一块了。因为是银行的项目,所以对数据的安全要求比较高,其次在这个项目里面学到的就是银行项目开发的严谨,比如说数据类型和前后台数据统一和维护,以及接口的规范。
好了现在就进入到这篇博客的正文,那就是数据的加密解密问题。
通常我们在进行数据的传递的时候都会对请求的数据以及得到的数据进行加解密,这样别人在截取我们应用的数据的时候就不会对我们造成太多的破坏。一般的应用只要进行一些简单的数据加解密就行了,我们一般进行的操作就是用BASE64 或者MD5对数据进行加解密。但是,在王小云教授宣布已经破解了MD5以及利用hash数组进行加解密的算法后,MD5不再是那么安全了,特别是关于银行的和一些对数据比较敏感的开发就只能用更安全或者更复杂的算法进行加解密了。比如DES/AES/等算法。
首先我们来看一下在开发中接触到的密码学。
我们在开发的时候会接触到双向解密和单向加密,其中双向加密又分为对称机密和非对称加密。对称加密就是指的我们用同一秘钥进行加密解密,所以对称加密又称为单密钥加密,它主要运用在一些加密的数据量比较大的场合。对称加密主要的加密算法有DES/3DES/AES.等。其次就是非对称加密,这种加密算法需要有公开秘钥和私有秘钥,也就是说数据通讯的两端必须拥有公开秘钥和私有秘钥的其中一个才能进行数据的加密和解密。非对称加密主要包括了RSA/DSA等算法。第二、就是单向加密,数据只能进行加密不能解密(很多的文章说数据不能解密,我当时就纳闷了,不能解密了那人家怎么对你的数据进行校验啊?在看了算法以后才明白,就是在甲方进行加密然后对乙方公布加密的算法,然后乙方对获得的数据按照乙方给的算法进行数据的校对,通过这样的机制进行数据的传递)。
在本项目中我们主要应用的是AES算法+MD5+SHA算法对数据进行加解密。
下面是主要用到的几个类:
AES加密算法部分代码
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.SecureRandom; import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;/**
* 加密解密
*/
public class AESUtil { public static String algorithm ="AES"; public static String enctrypt(String content,String password){
SecretKey key = getKey(algorithm,password);
byte [] enCodeFormat = key.getEncoded();
SecretKeySpec ss = new SecretKeySpec(password.getBytes(), algorithm);
try {
IvParameterSpec iv = new IvParameterSpec(password.getBytes("UTF-8"));
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, ss,iv);
// cipher.init(Cipher.ENCRYPT_MODE, ss);
byte b [] = cipher.doFinal(content.getBytes());
return byteToHex(b);
} catch (Exception e) {
LogCatLog.e("AES 加密失败",e);
} return null;
} public static String decrypt(byte [] content,String password){
// SecretKey key = getKey(algorithm,password);
// byte [] enCodeFormat = key.getEncoded();
SecretKeySpec ss = new SecretKeySpec(password.getBytes(), algorithm); try {
IvParameterSpec iv = new IvParameterSpec(password.getBytes("UTF-8"));
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, ss,iv);
// cipher.init(Cipher.DECRYPT_MODE, ss);
byte b [] = cipher.doFinal(content);
return new String(b);
} catch (Exception e) {
LogCatLog.e("AES 解密失败",e);
} return null;
}
/**
* 使用keygenerator 依赖平台,导致Android和java加密出来的密文不一致
*
* @param algorithm
* @param password
* @return
*/
public static SecretKey getKey(String algorithm,String password){ try {
KeyGenerator gen = KeyGenerator.getInstance(algorithm);
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
secureRandom.setSeed(password.getBytes()); gen.init(128, secureRandom);
// gen.init(128);
return gen.generateKey();
} catch (NoSuchAlgorithmException e) {
LogCatLog.e("getKey 获取加密密钥失败 ",e);
e.printStackTrace();
}
return null;
} private static String byteToHex(byte [] b){
StringBuilder sb = new StringBuilder();
for (int i = 0; i < b.length; i++) {
String s = Integer.toHexString(b[i] & 0xFF);
if(s.length()==1){
s = '0'+s;
}
sb.append(s.toUpperCase());
}
return sb.toString();
} public static byte[] hexStrToByte(String hexStr) {
if (hexStr == null || hexStr.equals("")) {
return null;
}
hexStr = hexStr.toUpperCase();
int length = hexStr.length() / 2;
char[] hexChars = hexStr.toCharArray();
byte[] d = new byte[length];
for (int i = 0; i < length; i++) {
int pos = i * 2;
d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));
}
return d;
} private static byte charToByte(char c) {
int index = "0123456789ABCDEF".indexOf(c);
if(index==-1){
index = "0123456789abcdef".indexOf(c);
}
return (byte)index;
} }
MD5算法部分代码
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.security.MessageDigest; /**
* @Description 不解释
*/
public final class MD5Util {
private static final char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D',
'B', 'C', 'D', 'B', 'O', 'T', 'H', 'O', 'F', 'Y', 'O', 'U' }; /** 对文件加密 */
public static String encode(File file) {
FileInputStream in = null;
MessageDigest md5 = null;
try {
in = new FileInputStream(file);
FileChannel ch = in.getChannel();
MappedByteBuffer byteBuffer = ch.map(FileChannel.MapMode.READ_ONLY, 0, file.length());
md5 = MessageDigest.getInstance("MD5");
md5.update(byteBuffer);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if(in != null)
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return toHex(md5.digest());
} /** 对字符串加密 */
public static String encode(String arg) {
if (arg == null) {
arg = "";
}
MessageDigest md5 = null;
try {
md5 = MessageDigest.getInstance("MD5");
md5.update(arg.getBytes("utf-8"));
} catch (Exception e) {
e.printStackTrace();
}
return toHex(md5.digest());
} private static String toHex(byte[] bytes) {
StringBuffer str = new StringBuffer(32);
for (byte b : bytes) {
str.append(hexDigits[(b & 0xf0) >> 4]);
str.append(hexDigits[(b & 0x0f)]);
}
return str.toString();
} public static String md5_3(String arg) {
if (arg == null) {
arg = "";
}
MessageDigest md5 = null;
try {
md5 = MessageDigest.getInstance("MD5");
byte[] a = md5.digest(arg.getBytes("utf-8"));
a = md5.digest(a);
md5.update(a);
} catch (Exception e) {
e.printStackTrace();
}
return toHex(md5.digest());
} /**
* MD5加密 以byte数组表示的字符串
* 结果与encode(String arg)返回的一样
*
* @param bytes 目标byte数组
* @return MD5加密后的字符串
*/
public static String getMD5String(String str) {
return getMD5String(str.getBytes());
}
public static String getMD5String(byte[] bytes) {
MessageDigest md5 = null;
try {
md5 = MessageDigest.getInstance("MD5");
md5.update(bytes);
} catch (Exception e) {
e.printStackTrace();
}
return toHex(md5.digest());
} public static String toHex2(byte[] bytes){
StringBuffer sb = new StringBuffer();
for (int i = 0; i < bytes.length; i++) {
String shex = Integer.toHexString(bytes[i] & 0xff);
if(shex.length()==1){
shex='0'+shex;
}
sb.append(shex);
}
return sb.toString().toUpperCase();
} public static String getMD5StringQGen(String str) {
MessageDigest md5 = null;
try {
md5 = MessageDigest.getInstance("MD5");
md5.update(str.getBytes());
} catch (Exception e) {
e.printStackTrace();
}
return toHex2(md5.digest());
}
}
Android数据加密解密的更多相关文章
- Android数据加密之异或加密算法
前言: 这几天被公司临时拉到去做Android IM即时通信协议实现,大致看了下他们定的协议,由于之前没有参与,据说因服务器性能限制,只达成非明文传递,具体原因我不太清楚,不过这里用的加密方式是采用异 ...
- Android数据加密之SHA安全散列算法
前言: 对于SHA安全散列算法,以前没怎么使用过,仅仅是停留在听说过的阶段,今天在看图片缓存框架Glide源码时发现其缓存的Key采用的不是MD5加密算法,而是SHA-256加密算法,这才勾起了我的好 ...
- Android数据加密之MD5加密
前言: 项目中无论是密码的存储或者说判断文件是否是同一文件,都会用到MD5算法,今天来总结一下MD5加密算法. 什么是MD5加密? MD5英文全称“Message-Digest Algorithm 5 ...
- Android数据加密之Rsa加密
前言: 最近无意中和同事交流数据安全传输的问题,想起自己曾经使用过的Rsa非对称加密算法,闲下来总结一下. 其他几种加密方式: Android数据加密之Rsa加密 Android数据加密之Aes加密 ...
- Android数据加密之Aes加密
前言: 项目中除了登陆,支付等接口采用rsa非对称加密,之外的采用aes对称加密,今天我们来认识一下aes加密. 其他几种加密方式: Android数据加密之Rsa加密 Android数据加密之Aes ...
- Android数据加密之Des加密
前言: 端午节前有个同事咨询我有关Android DES加密的相关实现,简单的实现了一下,今天来总结一下. 其他几种加密方式: Android数据加密之Rsa加密 Android数据加密之Aes加密 ...
- Android数据加密概述及多种加密方式 聊天记录及账户加密 提供高质量的数据保护
Android数据加密概述及多种加密方式 聊天记录及账户加密 提供高质量的数据保护 数据加密又称password学,它是一门历史悠久的技术,指通过加密算法和加密密钥将明文转变为密文.而解密则是通过解密 ...
- Android加密解密
随笔分类 - Android加密解密 Android数据加密之异或加密算法 摘要: 前言: 这几天被公司临时拉到去做Android IM即时通信协议实现,大致看了下他们定的协议,由于之前没有参与,据说 ...
- android加密解密完美教程
经常使用加密算法:DES.3DES.RC4.AES,RSA等; 对称加密:des,3des,aes 非对称加密:rsa 不可逆加密:md5 加密模式:ECB.CBC.CFB.OFB等; 填充模式:No ...
随机推荐
- android MediaCodec 音频编解码的实现——转码
原文地址:http://blog.csdn.net/tinsanmr/article/details/51049179 从今天开始 每周不定期更新博客,把这一周在工作与学习中遇到的问题做个总结.俗话说 ...
- sql 减去分钟
SQL SERVER:SELECT DATEADD( minute,-10,GETDATE()) ORACLE:SELECT to_char(sysdate -interval '10' minute ...
- ArcMap - 分割.
一,分割面: 1,在屏幕上新增线分割面: 使待编辑的面处于编辑状态 -> 选择待分割的面(使其处于选中状态) -> 选择编辑工具的 (Cut Polygons Tools) ->画线 ...
- vs编译和运行的区
编译: 是把代码转变成一系列指令(把源代码翻译为计算机能够识别的语言),产生目标代码,并不限于EXE(EXE只是WINDOWS的东西),这样才能装入内存; 运行: 是运行目标代码(运行EXE),就是执 ...
- 分享最近和同事处理的 解析XML的相关问题
CREATE OR REPLACE PROCEDURE BATCHINSERTSK_DEVICE_RECORD1( xmlstr IN clob, v_commits o ...
- 改进《完美让IE兼容input placeholder属性的jquery实现》的不完美
<完美让IE兼容input placeholder属性的jquery实现>中的代码在IE9以下浏览器中会出错,原因是因为ie9以下的浏览器对input的标签的解释不同. 例如对以下文本框的 ...
- Android的进程和线程(转)
进程和线程 当一个应用程序第一次启动的时候,Android会启动一个Linux进程和一个主线程(即UI线程:主要负责处理用户的按键事件.触屏事件及屏幕绘图事件等).默认情况下,所有该程序的组件都将在该 ...
- Eclipse启动Tomcat报错,系统缺少本地apr库
Eclipse启动Tomcat报错,系统缺少本地apr库. Tomcat中service.xml中的设置情况. 默认情况是HTTP协议的值:protocol="HTTP/1.1" ...
- 如何用angularjs制作一个完整的表格之五__完整的案例
由于本人也是边学边写,因此整理的比较乱,下面放出我例子的完整代码,方便大家交流测试,如有问题欢迎评论 首先,表格采用的是BootStrap样式编辑的,主要使用的是angularjs,为了方便也有jQu ...
- CSS3学习--dispaly:inline和float:left两者区别
1.display:inline: 任何不是块级元素的可见元素都是内联元素.其表现的特性是“行布局”形式!(行布局:其表现形式始终以行进行显示) 2.float:left:指定元素脱离普通的文档流 ...