一直对加密和解密有着某种神秘感,这个周末决定好好学习一下。加密是以某种算法来改变原来的信息,使未得到授权的用户即使获得已加密的信息,也无法了解原来的信息内容。可分为单向加密和双向加密,其中双向加密有两种,对称加密和非对称加密。
单向加密是对信息进行摘要计算,不能通过算法生成明文。双向加密是加密成密文后,得到秘钥可以还原成明文。有一些观点认为单向加密不属于加密算法,它只能对信息计算摘要,我们不去讨论这个问题。
一般来说单向加密算法有MD5,SHA,HMAC几种,BASE64是编码算法,不是加密算法,有的地方有可能认为这是一种加密算法,特此说明一下。MD5,SHA和HMAC是非可逆算法,就是说无法解密的加密算法,但是这几种算法加密并不可靠,有很多网站提供了密码破解服务,比如,破解MD5加密信息的网站有很多很多,如http://www.cmd5.com/.
MD5(Message DIGEST ALGORITHM 5),叫做信息摘要算法,可用于文件校验:
java代码如下:
public static void main(String[] args) throws Exception {
String name = "davidyang013@gmail.com";
byte[] data = name.getBytes();
System.out.println(byte2hex(getMD5(data)));
}
public static byte[] getMD5(byte[] data) throws Exception {
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(data);
return md5.digest();
}
//binary to hexdecimal
public static String byte2hex(byte[] b) {
String hs = "";
String stmp = "";
for (int n = 0; n < b.length; n++) {
stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));
if (stmp.length() == 1) {
hs = hs + "0" + stmp;
} else {
hs = hs + stmp;
}
}
return hs.toUpperCase();
}
输出是:
0BFA45D98A1F0856A4261B32901A0B67
python代码可能会简单一点:
import md5
hash = md5.new()
hash.update("davidyang013@gmail.com")
hash.hexdigest()
他们的输出是一样的,java的代码是大写的,python是小写的,可以去调整一下。
MD5算法原理,可参考http://blog.youkuaiyun.com/forgotaboutgirl/article/details/7258109
SHA(Secure Hash Algorithm),叫做安全散列算法,可作为数字签名,广泛应用于电子商务等信息安全领域,虽然和MD5一样都被破解了,但比MD5要安全一点。
java代码:
public static void main(String[] args) throws Exception {
String name = "davidyang013@gmail.com";
byte[] data = name.getBytes();
System.out.println("SHA-1:" + byte2hex(getSHA(data)));
}
public static byte[] getSHA(byte[] data) throws Exception {
MessageDigest sha = MessageDigest.getInstance("SHA-1");
sha.update(data);
return sha.digest();
}
输出结果是:
SHA-1:A6DDBADE1F91D2A30CE48244528DFED5BD9FB039
Python代码:
import sha
hash = sha.new()
hash.update("davidyang013@gamil.com")
hash.hexdigest()
HMAC(Hash Message Authentication Code),叫做散列消息鉴别吗,基于秘钥的Hash算法的认证协议。实现原理是,用公开函数和秘钥产生一个固定长度的值(即MAC)作为认证标识,用它来鉴别消息的完整性。MAC算法可选一下几种,HmacMD5,hmacSHA1,hmacSHA256,hmacSHA512.
java代码如下:
public static void main(String[] args) throws Exception {
String name = "davidyang013@gmail.com";
byte[] data = name.getBytes();
String hmacKey = initMacKey();
System.out.println("encrypted key :" + hmacKey);
System.out.println("HMAC:" + byte2hex(getHMAC(data,hmacKey)));
}
//initialize
public static String initMacKey() throws Exception {
KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacMD5");
SecretKey secretKey = keyGenerator.generateKey();
return encryptBASE64(secretKey.getEncoded());
}
//get encrypted content
public static byte[] getHMAC(byte[] data, String key) throws Exception {
SecretKey secretKey = new SecretKeySpec(decryptBASE64(key), "HmacMD5");
Mac mac = Mac.getInstance(secretKey.getAlgorithm());
mac.init(secretKey);
return mac.doFinal(data);
}
public static String encryptBASE64(byte[] key) throws Exception {
return (new BASE64Encoder()).encodeBuffer(key);
}
HMAC不同于MD5和SHA的地方在于,它有一个秘钥,增强了数据传输过程中的安全性。
未完待续。。。