分享Java常⽤⼏种加密算法(四种)
对称加密算法是应⽤较早的加密算法,技术成熟。在对称加密算法中,数据发信⽅将明⽂(原始数据)和加密密钥(mi yue)⼀起经过特殊加密算法处理后,使其变成复杂的加密密⽂发送出去。收信⽅收到密⽂后,若想解读原⽂,则需要使⽤加密⽤过的密钥及相同算法的逆算法对密⽂进⾏解密,才能使其恢复成可读明⽂。在对称加密算法中,使⽤的密钥只有⼀个,发收信双⽅都使⽤这个密钥对数据进⾏加密和解密,这就要求解密⽅事先必须知道加密密钥。
简单的java加密算法有:
BASE 严格地说,属于编码格式,⽽⾮加密算法
MD(Message Digest algorithm ,信息摘要算法)
SHA(Secure Hash Algorithm,安全散列算法)
HMAC(Hash Message Authentication Code,散列消息鉴别码)
第⼀种. BASE
Base是⽹络上最常见的⽤于传输Bit字节代码的编码⽅式之⼀,⼤家可以查看RFC~RFC,上⾯有MIME的详细规范。Base编码可⽤于在HTTP环境下传递较长的标识信息。例如,在Java Persistence系统Hibernate中,就采⽤了Base来将⼀个较长的唯⼀标识符(⼀般为-bit的UUID)编码为⼀个字符串,⽤作HTTP表单和HTTP GET URL中的参数。在其他应⽤程序中,也常常需要把⼆进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采⽤Base编码具有不可读性,即所编码的数据不会被⼈⽤⾁眼所直接看到。(来源百度百科)
java实现代码:
package com.单向加密;
import sun.misc.BASEDecoder;
import sun.misc.BASEEncoder;
/*
BASE的加密解密是双向的,可以求反解.
BASEEncoder和BASEDecoder是⾮官⽅JDK实现类。虽然可以在JDK⾥能到并使⽤,但是在API⾥查不到。
JRE 中 sun 和 com.sun 开头包的类都是未被⽂档化的,他们属于 java, javax 类库的基础,其中的实现⼤多数与底层平台有关,
⼀般来说是不推荐使⽤的。
BASE 严格地说,属于编码格式,⽽⾮加密算法
主要就是BASEEncoder、BASEDecoder两个类,我们只需要知道使⽤对应的⽅法即可。
另,BASE加密后产⽣的字节位数是的倍数,如果不够位数以=符号填充。
BASE
按照RFC的定义,Base被定义为:Base内容传送编码被设计⽤来把任意序列的位字节描述为⼀种不易被⼈直接识别的形式。
(The Base Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.)
常见于邮件、http加密,截取http信息,你就会发现登录操作的⽤户名、密码字段通过BASE加密的。
*/
public class BASE {
/**
* BASE解密
*
* @param key
* @return
* @throws Exception
*/
public static byte[] decryptBASE(String key) throws Exception {
return (new BASEDecoder()).decodeBuffer(key);
}
/**
* BASE加密
*
* @param key
* @return
* @throws Exception
*/
public static String encryptBASE(byte[] key) throws Exception {
return (new BASEEncoder()).encodeBuffer(key);
}
public static void main(String[] args) {
String str="";
try {
String result= Bytes());
System.out.println("result=====加密数据=========="+result);
byte result[]= BASE.decryptBASE(result);
String str=new String(result);
System.out.println("str========解密数据========"+str);
} catch (Exception e) {
e.printStackTrace();
}
}
}
第⼆种. MD
MD即Message-Digest Algorithm (信息-摘要算法),⽤于确保信息传输完整⼀致。是计算机⼴泛使⽤的杂凑算法之⼀(⼜译摘要算法、哈希算法),主流编程语⾔普遍已有MD实现。将数据(如汉字)运算为另⼀固定长度值,是杂凑算法的基础原理,MD的前⾝有MD、MD和MD。⼴泛⽤于加密和解密技术,常⽤于⽂件校验。校验?不管⽂件多⼤,经过MD后都能⽣成唯⼀的MD值。好⽐现在的ISO校验,都是MD校验。怎么⽤?当然是把ISO经过MD后产⽣MD的值。⼀般下载linux-ISO的朋友都见过下载链接旁边放着MD的串。就是⽤来验证⽂件是否⼀致的。
java实现:
package com.单向加密;
import java.math.BigInteger;
import java.security.MessageDigest;
/*
MD(Message Digest algorithm ,信息摘要算法)
通常我们不直接使⽤上述MD加密。通常将MD产⽣的字节数组交给BASE再加密⼀把,得到相应的字符串
Digest:汇编
*/
public class MD {
public static final String KEY_MD = "MD";
public static String getResult(String inputStr)
{
System.out.println("=======加密前的数据:"+inputStr);
BigInteger bigInteger=null;
try {
MessageDigest md = Instance(KEY_MD);
byte[] inputData = Bytes();
md.update(inputData);
bigInteger = new BigInteger(md.digest());
} catch (Exception e) {e.printStackTrace();}
System.out.println("MD加密后:" + String());
String();
}
public static void main(String args[])
{
try {
String inputStr = "简单加密";
getResult(inputStr);
} catch (Exception e) {
e.printStackTrace();
}
}
}
MD算法具有以下特点:
、压缩性:任意长度的数据,算出的MD值长度都是固定的。
、容易计算:从原数据计算出MD值很容易。
java加密方式有哪些、抗修改性:对原数据进⾏任何改动,哪怕只修改个字节,所得到的MD值都有很⼤区别。
、弱抗碰撞:已知原数据和其MD值,想到⼀个具有相同MD值的数据(即伪造数据)是⾮常困难的。
、强抗碰撞:想到两个不同的数据,使它们具有相同的MD值,是⾮常困难的。
MD的作⽤是让⼤容量信息在⽤数字签名软件签署私⼈密钥前被"压缩"成⼀种保密的格式(就是把⼀个任意长度的字节串变换成⼀定长的⼗六进制数字串)。除了MD以外,其中⽐较有名的还有sha-、RIPEMD以及Haval等。
第三种.SHA
安全哈希算法(Secure Hash Algorithm)主要适⽤于数字签名标准(Digital Signature Standard DSS)⾥⾯定义的数字签名算法(Digital Signature Algorithm DSA)。对于长度⼩于^位的消息,SHA会产⽣⼀个位的消息摘要。该算法经过加密专家多年来的发展和改进已⽇益完善,并被⼴泛使⽤。该算法的思想是接收⼀段明⽂,然后以⼀种不可逆的⽅式将它转换成⼀段(通常更⼩)密⽂,也可以简单的理解为取⼀串输⼊码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。散列函数值可以说是对明⽂的⼀种“指纹”或是“摘要”所以对散列值的数字签名就可以视为对此明⽂的数字签名。
java实现:
package com.单向加密;
import java.math.BigInteger;
import java.security.MessageDigest;
/*
SHA(Secure Hash Algorithm,安全散列算法),数字签名等密码学应⽤中重要的⼯具,
被⼴泛地应⽤于电⼦商务等信息安全领域。虽然,SHA与MD通过碰撞法都被破解了,
但是SHA仍然是公认的安全加密算法,较之MD更为安全*/
public class SHA {
public static final String KEY_SHA = "SHA";
public static String getResult(String inputStr)
{
BigInteger sha =null;
System.out.println("=======加密前的数据:"+inputStr);
byte[] inputData = Bytes();
try {
MessageDigest messageDigest = Instance(KEY_SHA);
messageDigest.update(inputData);
sha = new BigInteger(messageDigest.digest());
System.out.println("SHA加密后:" + String());
} catch (Exception e) {e.printStackTrace();}
String();
}
public static void main(String args[])
{
try {
String inputStr = "简单加密";
getResult(inputStr);
} catch (Exception e) {
e.printStackTrace();
}
}
}
SHA-与MD的⽐较
因为⼆者均由MD导出,SHA-和MD彼此很相似。相应的,他们的强度和其他特性也是相似,但还有以下⼏点不同:
对强⾏攻击的安全性:最显著和最重要的区别是SHA-摘要⽐MD摘要长位。使⽤强⾏技术,产⽣任何⼀个报⽂使其摘要等于给定报摘要的难度对MD是^数量级的操作,⽽对SHA-则是^数量级的操作。这样,SHA-对强⾏攻击有更⼤的强度。
对密码分析的安全性:由于MD的设计,易受密码分析的攻击,SHA-显得不易受这样的攻击。
速度:在相同的硬件上,SHA-的运⾏速度⽐MD慢。
第四种.HMAC
HMAC(Hash Message Authentication Code,散列消息鉴别码,基于密钥的Hash算法的认证协议。消息鉴别码实现鉴别的原理是,⽤公开函数和密钥产⽣⼀个固定长度的值作为认证标识,⽤这个标识鉴别消息的完整性。使⽤⼀个密钥⽣成⼀个固定⼤⼩的⼩数据块,即MAC,并将其加⼊到消息中,然后传输。接收⽅利⽤与发送⽅共享的密钥进⾏鉴别认证等。
java实现代码:
package com.单向加密;
/*
HMAC
HMAC(Hash Message Authentication Code,散列消息鉴别码,基于密钥的Hash算法的认证协议。
消息鉴别码实现鉴别的原理是,⽤公开函数和密钥产⽣⼀个固定长度的值作为认证标识,⽤这个标识鉴别消息的完整性。
使⽤⼀个密钥⽣成⼀个固定⼤⼩的⼩数据块,
即MAC,并将其加⼊到消息中,然后传输。接收⽅利⽤与发送⽅共享的密钥进⾏鉴别认证等。*/
pto.KeyGenerator;
pto.Mac;
pto.SecretKey;
pto.spec.SecretKeySpec;
import comm.Tools;
/**
* 基础加密组件
*/
public abstract class HMAC {
public static final String KEY_MAC = "HmacMD";
/**
* 初始化HMAC密钥
*
* @return
* @throws Exception
*/
public static String initMacKey() throws Exception {
KeyGenerator keyGenerator = Instance(KEY_MAC);
SecretKey secretKey = ateKey();
Encoded());
}
/**
* HMAC加密:主要⽅法
*
* @param data
* @param key
* @return
* @throws Exception
*/
public static String encryptHMAC(byte[] data, String key) throws Exception {
SecretKey secretKey = new SecretKeySpec(BASE.decryptBASE(key), KEY_MAC);
Mac mac = Algorithm());
mac.init(secretKey);
return new String(mac.doFinal(data));
}
public static String getResult(String inputStr)
{
String ClassPath();
String fileSource=path+"/file/";
System.out.println("=======加密前的数据:"+inputStr);
String result=null;
try {
byte[] inputData = Bytes();
String key = HMAC.initMacKey(); /*产⽣密钥*/
System.out.println("Mac密钥:===" + key);
/*将密钥写⽂件*/
Tools.WriteMyFile(fileSource,key);
result= ptHMAC(inputData, key);
System.out.println("HMAC加密后:===" + result);
} catch (Exception e) {e.printStackTrace();}
String();
}
public static String getResult(String inputStr)
{
System.out.println("=======加密前的数据:"+inputStr);
String ClassPath();
String fileSource=path+"/file/";
String key=null;;
try {
/
*将密钥从⽂件中读取*/
key=Tools.ReadMyFile(fileSource);
System.out.println("getResult密钥:===" + key);
} catch (Exception e) {
e.printStackTrace();}
String result=null;
try {
byte[] inputData = Bytes();
/*对数据进⾏加密*/
result= ptHMAC(inputData, key);
System.out.println("HMAC加密后:===" + result);
} catch (Exception e) {e.printStackTrace();}
String();
}
public static void main(String args[])
{
try {
String inputStr = "简单加密";
/*使⽤同⼀密钥:对数据进⾏加密:查看两次加密的结果是否⼀样*/
getResult(inputStr);
getResult(inputStr);
} catch (Exception e) {
e.printStackTrace();
}
}
}
以上内容是⼩编给⼤家分享的Java常⽤⼏种加密算法(四种),希望⼤家喜欢。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论