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 ...
随机推荐
- Linux软件安装,RPM与YUM
为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/SJQ. http://www.cnblogs.com/shijiaqi1066/p/3843955.html ...
- Extjs ——radiogroup子元素宽度调整
配置项 类型 说明 allowBlank Boolean 设置是否必须选择至少一项,true表示可以不选,false表示不能为空至少选一项,默认为true blankText String 当allo ...
- javascript中,你真的会用console吗?
使用console进行性能测试和计算代码运行时间 对于前端开发人员,在开发过程中经常需要监控某些表达式或变量的值,如果使用用debugger会显得过于笨重,最常用的方法是会将值输出到控制台上方便调试. ...
- PHP 解决时差8小时的问题
有时候用php echo date("Y-m-d H:i:s")的时候会发现自己的时间和系统时间有差别 这里问题一般就是因为你自己的时区和配置的时区出现了差别的原因: 解决办法有三 ...
- java移位运算的用途
参考下面这篇文章 http://blog.csdn.net/gaowen_han/article/details/7163104 http://jinguo.iteye.com/blog/540150 ...
- win2008 64位下.net 无法访问oracle
这两天换了台新机子,就想弄个新系统win2008 64bit来测试下,也尝尝新鲜,结果是碰的头破血流啊,哈哈就像挖宝似的 环境:win2008 64bit + IIS7+.net2.0 +ORACLE ...
- Android开发文摘集合1
作者:张明云 原标题:Android 开发中,有哪些坑需要注意? 作者github主页:zmywly8866.github.io/ 在Android library中不能使用switch-case语句 ...
- mem 族函数的实现
1.void * memcpy ( void * dest, const void * src, size_t num ); 头文件:#include <string.h>memcpy() ...
- SGU 112.a^b - b^a
题意: 如标题. 方法: 简单高精度... 代码(继续JAVA 水过) import java.util.*; import java.math.*; public class Solution { ...
- Android 视图切换库的使用 - SwitichLayout
要点: 1. SwitichLayout 原理和基本特效展示 - 设计上和基本特效 2. SwitchLayout 的用法 - SwitchLayout 的基本配置和用法 3. SwithLayout ...