JDK中带有部分加密算法的实现类,主要的是java.security和javax.crypto包下的类,还可以使用Bouncy Castle(丰富JDK中加密算法的不足)jar包是:bcprov-jdk15on-1.57.jar和Commons Codec(简化JDK中加密的操作)jar包是:commons-codec-1.10.jar
Base64
Base64用于网络中传输的数据进行编码,严格意义上属于编码的格式,有64个字符的对应的编码,Base64就是将内容按照该格式进行编码。可以对数据编码和解码,是可逆的,安全度较低,不过,也可以作为最基础最简单的加密算法用于加密要求较弱的情况
Base64可以使用JDk中自带的类实现,还可以使用Bouncy Castle(简称bc)或Commons Codec(简称cc)实现
加密数据:
private static String src="Hello Base64";
导入的类:
importjava.io.IOException;importorg.apache.commons.codec.binary.Base64;importsun.misc.BASE64Decoder;import sun.misc.BASE64Encoder;
JDk实现主要使用用BASE64Encoder和BASE64Decoder类的方法(注意:在Eclipse中使用JDK的Base64可能会出现找不到的问题,是因为Base64Encoder并不属于JDK标准库范畴,但是又包含在了JDK中,需要我们手动导入\jre\lib目录下的rt.jar包即可):
public static voidjdkBase64(){try{
BASE64Encoder encoder=newBASE64Encoder();
String encode=encoder.encode(src.getBytes());
System.out.println("encode: "+encode);
BASE64Decoder decoder=newBASE64Decoder();
String decode=newString(decoder.decodeBuffer(encode));
System.out.println("decode: "+decode);
}catch(IOException e) {
e.printStackTrace();
}
}
bc实现主要是用Base64类的方法:
public static voidbouncybastleBase64(){byte[] encode =org.bouncycastle.util.encoders.Base64.encode(src.getBytes());
System.out.println("encode: "+newString(encode));byte[] decode =org.bouncycastle.util.encoders.Base64.decode(encode);
System.out.println("decode: "+newString(decode));
}
cc实现也是用Base64类,不过与bc的是不一样的,不同包中的类,只是名字一样:
public static voidcommonscodecBase64(){byte[] encode=Base64.encodeBase64(src.getBytes());
System.out.println("encode: "+new String(encode)); //需要转化为String
byte[] decode =Base64.decodeBase64(encode);
System.out.println("decode: "+newString(decode));
}
摘要算法
摘要算法主要分为MD,SHA和Hmac算法,摘要算法其实是用于效验数据完整性的,我们在下载某些文件时,会有MD5和SHA1值提供我们效验下载的文件是否完整,可以用于根据数据生成其唯一的摘要值,无法根据摘要值知道原数据,属于不可逆的
MD:
加密数据:
private static String src="Hello MD";
导入的类:
importjava.security.MessageDigest;importjava.security.NoSuchAlgorithmException;importjava.security.Provider;importjava.security.Security;importorg.apache.commons.codec.binary.Hex;importorg.apache.commons.codec.digest.DigestUtils;importorg.bouncycastle.crypto.Digest;importorg.bouncycastle.crypto.digests.MD2Digest;importorg.bouncycastle.crypto.digests.MD4Digest;importorg.bouncycastle.crypto.digests.MD5Digest;import org.bouncycastle.jce.provider.BouncyCastleProvider;
JDK有MD2和MD5的实现,使用的是MessageDigest类,而没有MD4的实现:
public static voidjdkMD5(){try{
MessageDigest md=MessageDigest.getInstance("MD5");byte[] digest =md.digest(src.getBytes());
System.out.println("JDK MD5: "+Hex.encodeHexString(digest)); //使用的是cc中带的Hex需要转换为十六进制
} catch(NoSuchAlgorithmException e) {
e.printStackTrace();
}
}public static voidjdkMD2(){try{
MessageDigest md=MessageDigest.getInstance("MD2");byte[] digest =md.digest(src.getBytes());
System.out.println("JDK MD2: "+Hex.encodeHexString(digest));
}catch(NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
而bc这三种都有,使用的是Digest 类:
public static voidbcMD4(){//方式一//Digest digest=new MD4Digest();//digest.update(src.getBytes(), 0, src.getBytes().length);//byte[] md4Bytes=new byte[digest.getDigestSize()];//digest.doFinal(md4Bytes, 0);//System.out.println("BC MD4: "+org.bouncycastle.util.encoders.Hex.toHexString(md4Bytes));//方式二(通过添加provider的方式,将sun的改为bc的provider)
try{
Security.addProvider(new BouncyCastleProvider()); //通过添加provider的方式
MessageDigest md=MessageDigest.getInstance("MD4");byte[] digest =md.digest(src.getBytes());
System.out.println("BC MD4: "+Hex.encodeHexString(digest));
}catch(NoSuchAlgorithmException e) {
e.printStackTrace();
}
}public static voidbcMD5(){
Digest digest=newMD5Digest();
digest.update(src.getBytes(),0, src.getBytes().length);byte[] md4Bytes=new byte[digest.getDigestSize()];
digest.doFinal(md4Bytes,0);
System.out.println("BC MD5: "+org.bouncycastle.util.encoders.Hex.toHexString(md4Bytes));
}public static voidbcMD2(){
Digest digest=newMD2Digest();
digest.update(src.getBytes(),0, src.getBytes().length);byte[] md4Bytes=new byte[digest.getDigestSize()];
digest.doFinal(md4Bytes,0);
System.out.println("BC MD2: "+org.bouncycastle.util.encoders.Hex.toHexString(md4Bytes));
}
cc和JDK是一样的,毕竟是对JDK加密的简化,直接使用DigestUtils中的方法,很简单,而且前两种方法还需要将MD值转换为十六进制,cc直接就帮我们转了:
public static void ccMD2(){ //有方法直接就可以转换十六进制
System.out.println("CC MD2: "+DigestUtils.md2Hex(src.getBytes()));
}public static voidccMd5(){
System.out.println("CC MD5: "+DigestUtils.md5Hex(src.getBytes()));
}
SHA:
这里只是使用SHA-1,其他类型类似
加密数据:
private static String src="Hello SHA";
要导入的类: