java dofinal_Java加密算法

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:

13e23b5c1949433dfd3914d0c32262e0.png

加密数据:

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,其他类型类似

bd473721046ef04a62aae31a2b2598b9.png

加密数据:

private static String src="Hello SHA";

要导入的类:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值