项目中要求:
一 .运动数据加密功能
信息加密说明:
算法名称:DES
加密模式:ECB
填充方式:PKCS7Padding
经base64编码后的公钥:hU0c2Tas2yOLx0lAeozE1Q==
你方获此字符串后,经base64解码,可获取公钥,即可对运动数据进行加密。
二维码内容:interface://treadmill.do?data=base64编码后的加密运动数据
学习:
我们在开发的时候会接触到双向解密和单向加密,其中双向加密又分为对称机密和非对称加密。对称加密就是指的我们用同一秘钥进行加密解密,所以对称加密又称为单密钥加密,它主要运用在一些加密的数据量比较大的场合。对称加密主要的加密算法有DES/3DES/AES.等。其次就是非对称加密,这种加密算法需要有公开秘钥和私有秘钥,也就是说数据通讯的两端必须拥有公开秘钥和私有秘钥的其中一个才能进行数据的加密和解密。非对称加密主要包括了RSA/DSA等算法。第二、就是单向加密,数据只能进行加密不能解密(很多的文章说数据不能解密,我当时就纳闷了,不能解密了那人家怎么对你的数据进行校验啊?在看了算法以后才明白,就是在甲方进行加密然后对乙方公布加密的算法,然后乙方对获得的数据按照乙方给的算法进行数据的校对,通过这样的机制进行数据的传递)。
1、md5加密,该加密算法是单向加密,即加密的数据不能再通过解密还原。相关类包含在java.security.MessageDigest包中。
2、3-DES加密,该加密算法是可逆的,解密方可以通过与加密方约定的密钥匙进行解密。相关类包含在javax.crypto.*包中。
3、base64编码,是用于传输8bit字节代码最常用的编码方式。相关类在sun.misc.BASE64Decoder 和sun.misc.BASE64Encoder 中。
4、URLEncoder编码,是一种字符编码,保证被传送的参数由遵循规范的文本组成。相关类在java.net.URLEncoder包中。
代码网上都有,这里不再copy了.
import java.io.IOException;
import java.io.InputStream;
import java.security.MessageDigest;
public class MD5Utils {
public static String encode(InputStream in) {
try {
MessageDigest digester = MessageDigest.getInstance("MD5");
byte[] bytes = new byte[8192];
int byteCount;
while ((byteCount = in.read(bytes)) > 0) {
digester.update(bytes, 0, byteCount);
}
byte[] digest = digester.digest();
// 将byte 转化为string
StringBuffer sb = new StringBuffer();
for (byte b : digest) {
int i = b & 0xff;// 16进制数据
// 将16进制数据转化为string
String hex = Integer.toHexString(i);
// 1--->1---> 01
// 16--> 10
// 补位
if (hex.length() == 1) {
hex = 0 + hex;
}
sb.append(hex);
}
return sb.toString();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
in = null;
}
}
return null;
}
public static String encode(String pwd) {
try {
MessageDigest digester = MessageDigest.getInstance("MD5");
byte[] digest = digester.digest(pwd.getBytes());
// 将byte 转化为string
StringBuffer sb = new StringBuffer();
for (byte b : digest) {
int i = b & 0xff;// 16进制数据
// 将16进制数据转化为string
String hex = Integer.toHexString(i);
// 1--->1---> 01
// 16--> 10
// 补位
if (hex.length() == 1) {
hex = 0 + hex;
}
sb.append(hex);
}
return sb.toString();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static String encodeU(String pwd) {
// 0-9 + abc ---.52
try {
MessageDigest digester = MessageDigest.getInstance("MD5");
byte[] digest = digester.digest(pwd.getBytes());
// 将byte 转化为string
StringBuffer sb = new StringBuffer();
for (byte b : digest) {
// byte -256 -- 255
// 0 + 15
int i = (b + 1) & 0xff ;// 16进制数据
// 将16进制数据转化为string
String hex = Integer.toHexString(i);
// 1--->1---> 01
// 16--> 10
// 补位
if (hex.length() == 1) {
hex = 0 + hex;
}
sb.append(hex);
}
return sb.toString();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}