java加密用在什么地方 java加密的几种方式
老铁们,大家好,相信还有很多朋友对于java加密用在什么地方和java加密的几种方式的相关问题不太懂,没关系,今天就由我来为大家分享分享java加密用在什么地方以及java加密的几种方式的问题,文章篇幅可能偏长,希望可以帮助到大家,下面一起来看看吧!
java加密的几种方式
基本的单向加密算法:
BASE64严格地说,属于编码格式,而非加密算法
MD5(Message Digest algorithm 5,信息摘要算法)
SHA(Secure Hash Algorithm,安全散列算法)
HMAC(Hash Message Authentication Code,散列消息鉴别码)
复杂的对称加密(DES、PBE)、非对称加密算法:
DES(Data Encryption Standard,数据加密算法)
PBE(Password-based encryption,基于密码验证)
RSA(算法的名字以发明者的名字命名:Ron Rivest, AdiShamir和Leonard Adleman)
DH(Diffie-Hellman算法,密钥一致协议)
DSA(Digital Signature Algorithm,数字签名)
ECC(Elliptic Curves Cryptography,椭圆曲线密码编码学)
代码参考:
/**
*BASE64加密
*
*@paramkey
*@return
*@throwsException
*/
publicstaticStringencryptBASE64(byte[]key)throwsException{
return(newBASE64Encoder()).encodeBuffer(key);
}
/**
*MD5加密
*
*@paramdata
*@return
*@throwsException
*/
publicstaticbyte[]encryptMD5(byte[]data)throwsException{
MessageDigestmd5=MessageDigest.getInstance(KEY_MD5);
md5.update(data);
returnmd5.digest();
}
/**
*SHA加密
*
*@paramdata
*@return
*@throwsException
*/
publicstaticbyte[]encryptSHA(byte[]data)throwsException{
MessageDigestsha=MessageDigest.getInstance(KEY_SHA);
sha.update(data);
returnsha.digest();
}
}
/**
*初始化HMAC密钥
*
*@return
*@throwsException
*/
publicstaticStringinitMacKey()throwsException{
KeyGeneratorkeyGenerator=KeyGenerator.getInstance(KEY_MAC);
SecretKeysecretKey=keyGenerator.generateKey();
returnencryptBASE64(secretKey.getEncoded());
}
/**
*HMAC加密
*
*@paramdata
*@paramkey
*@return
*@throwsException
*/
publicstaticbyte[]encryptHMAC(byte[]data,Stringkey)throwsException{
SecretKeysecretKey=newSecretKeySpec(decryptBASE64(key),KEY_MAC);
Macmac=Mac.getInstance(secretKey.getAlgorithm());
mac.init(secretKey);
returnmac.doFinal(data);
}
java中的private到底有什么用
private直接翻译过来为私有的,但在Java中它的含义并不是私有的。而是本类中可用的,表面上是说只有本类中可以使用(更改)该变量或者方法。
但他还有一个含义为:只要在我这个类的范围内部(括号内)即可使用,他不关心使用者是谁,是他自己或者别的类中的实例(例如通过this使用)。只要你在我的类里面用就行了。所以private应该理解为本类中可使用的,而非是本类私有的。
将属性和方法用private封装后表示,被封装的属性与方法只能在本类中使用,类外部不可见。
此时要想访问被封装的属性,必须提供getter与setter方法
setter方法:主要进行属性内容的设置与修改
getter方法:主要进行属性内容的取得
类的设计原则:编写类的时候,没有额外说明,所有属性必须使用private封装(成员变量)
private不能用于外部类的封装,但是可以用于内部类的封装
扩展资料
Private变量只能在包含其声明的模块中使用。可以使用 Private语句声明变量的数据类型。例如,下面的语句声明了一个 Integer类型的变量:“Private NumberOfEmployees As Integer”也可以使用 Private语句来声明变量的对象类型。
实例声明一个变量,Private X As New Worksheet如果在定义对象变量时没有使用 New关键字,则在使用该变量之前,必须使用 Set语句将一个已有的对象赋给该引用对象的变量。
在赋值之前,所声明的这个对象变量有一个特定值 Nothing,这个值表示该变量没有指向任何对象的实例。可以用带空圆括号的 Private语句来声明动态数组,然后可以在过程内用 ReDim语句来定义该数组的维数和元素。
如果试图在 Private,Public或 Dim语句中重新定义一个已显式定义了大小的数组的维数,就会发生错误。当初始化变量时,数值变量被初始化为 0,变长的字符串被初始化为一个零长度的字符串(""),而定长的字符串则用 0填充。
Variant变量被初始化为 Empty,用户自定义类型的变量的每个元素作为各自独立的变量进行初始化。注意当在过程中使用 Private语句时,通常将 Private语句放在过程的开始。
参考资料:百度百科- Private(编程语句)
百度百科- Java(计算机编程语言)
Java加密和数字签名
Java加密和数字签名本文主要谈一下密码学中的加密和数字签名以及其在java中如何进行使用对密码学有兴趣的伙伴推荐看 Bruce Schneier的著作 Applied Crypotography在jdk的发行版本中安全性方面有了很大的改进也提供了对RSA算法的直接支持现在我们从实例入手解决问题(本文仅是作为简单介绍)
一密码学上常用的概念
)消息摘要
这是一种与消息认证码结合使用以确保消息完整性的技术主要使用单向散列函数算法可用于检验消息的完整性和通过散列密码直接以文本形式保存等目前广泛使用的算法有MD MD SHA jdk对上面都提供了支持在java中进行消息摘要很简单 java security MessageDigest提供了一个简易的操作方法
/***MessageDigestExample java*Copyright*/ import java security MessageDigest;/***单一的消息摘要算法不使用密码可以用来对明文消息(如密码)隐藏保存*/ public class MessageDigestExample{ public static void main(String[] args) throws Exception{ if(args length!=){ System err println( Usage:java MessageDigestExample text); System exit();}
byte[] plainText=args[ ] getBytes( UTF);
//使用getInstance(算法)来获得消息摘要这里使用SHA的位算法 MessageDigest messageDigest=MessageDigest getInstance( SHA);
System out println( \n+messageDigest getProvider() getInfo());//开始使用算法 messageDigest update(plainText); System out println( \nDigest:);//输出算法运算结果 System out println(new String(messageDigest digest() UTF));}}还可以通过消息认证码来进行加密实现 javax crypto Mac提供了一个解决方案有兴趣者可以参考相关API文档本文只是简单介绍什么是摘要算法
这里补充另一个运用消息摘要的方式加密的例子: public class TestEncrypt{
public TestEncrypt(){}
/***@param strSrc:strSrc is a string will be encrypted*@param encName: encName is the algorithm name will be used* encName dafault to MD*@return String*/ public String Encrypt(String strSrc String encName){
MessageDigest md= null; String strDes= null;
byte[] bt= strSrc getBytes(); try{ if(encName== null|| encName equals()){ encName= MD;} md= MessageDigest getInstance(encName); md update(bt); strDes= bytes Hex(md digest());//to HexString} catch(NoSuchAlgorithmException e){ System out println( Invalid algorithm); return null;} return strDes;}
public String bytes Hex(byte[] bts){ String des=; String tmp= null; for(int i=; i< bts length; i++){ tmp=(Integer toHexString(bts[i]& xFF)); if(tmp length()==){ des+=;} des+= tmp;} return des;}
public static void main(String[]args){ TestEncrypt te= new TestEncrypt(); String strSrc=可以加密汉字 Oh and english; System out println( Source String:+ strSrc); System out println( Encrypted String:); System out println( Use Def:+ te Encrypt(strSrc null)); System out println( Use MD:+ te Encrypt(strSrc MD)); System out println( Use SHA:+ te Encrypt(strSrc SHA)); System out println( Use SHA:+ te Encrypt(strSrc SHA));}}
另外在javawebparts中的 RequestHelpers里的generateGUID方法也涉及到了MD的方法代码如下: public static String generateGUID(HttpServletRequest request){
String out=; try{// Construct a string that is prised of:// Remote IP Address+ Host IP Address+ Date(yyyyMMdd)+// Time(hhmmssSSa)+ Requested Path+ Session ID+// HashCode Of ParameterMap StringBuffer***= new StringBuffer();*** append(request getRemoteAddr()); InetAddress ia= InetAddress getLocalHost();*** append(ia getHostAddress());*** append(new SimpleDateFormat( yyyyMMddhhmmssSSa) format(new Date())); String path= request getServletPath(); String pathInfo= request getPathInfo(); if(pathInfo!= null){ path+= pathInfo;}*** append(path);*** append(request getSession(false));*** append(request getParameterMap() hashCode()); String str=*** toString();// Now encode the string using an MD encryption algorithm MessageDigest md= MessageDigest getInstance( md); md update(str getBytes()); byte[] digest= md digest(); StringBuffer hexStr= new StringBuffer(); for(int i=; i< digest length; i++){ str= Integer toHexString( xFF& digest[i]); if(str length()<){ str=+ str;} hexStr append(str);} out= hexStr toString();} catch(NoSuchAlgorithmException nsae){ log error(nsae);} catch(UnknownHostException uhe){ log error(uhe);}// Return the encrypted string It should be unique based on the// ponents that prise the plain text string and should always be// characters thanks to the MD algorithm return out;
}// End generateGUID()
)私钥加密
消息摘要只能检查消息的完整性但是单向的对明文消息并不能加密要加密明文的消息的话就要使用其他的算法要确保机密性我们需要使用私钥密码术来交换私有消息
这种最好理解使用对称算法比如 A用一个密钥对一个文件加密而B读取这个文件的话则需要和A一样的密钥双方共享一个私钥(而在web环境下私钥在传递时容易被侦听)
使用私钥加密的话首先需要一个密钥可用javax crypto KeyGenerator产生一个密钥(java security Key)然后传递给一个加密工具(javax crypto Cipher)该工具再使用相应的算法来进行加密主要对称算法有 DES(实际密钥只用到位) AES(支持三种密钥长度位)通常首先位其他的还有DESede等 jdk种也提供了对对称算法的支持以下例子使用AES算法来加密
/***PrivateExmaple java*Copyright*/ import javax crypto Cipher; import javax crypto KeyGenerator; import java security Key;
/***私鈅加密保证消息机密性*/ public class PrivateExample{ public static void main(String[] args) throws Exception{ if(args length!=){ System err println( Usage:java PrivateExample<text>); System exit();} byte[] plainText=args[ ] getBytes( UTF);
//通过KeyGenerator形成一个key System out println( \nStart generate AES key); KeyGenerator keyGen=KeyGenerator getInstance( AES); keyGen init(); Key key=keyGen generateKey(); System out println( Finish generating DES key);
//获得一个私鈅加密类Cipher ECB是加密方式 PKCS Padding是填充方法 Cipher cipher=Cipher getInstance( AES/ECB/PKCS Padding); System out println( \n+cipher getProvider() getInfo());
//使用私鈅加密 System out println( \nStart encryption:); cipher init(Cipher ENCRYPT_MODE key); byte[] cipherText=cipher doFinal(plainText); System out println( Finish encryption:); System out println(new String(cipherText UTF));
System out println( \nStart decryption:); cipher init(Cipher DECRYPT_MODE key); byte[] newPlainText=cipher doFinal(cipherText); System out println( Finish decryption:);
System out println(new String(newPlainText UTF));
}}
)公钥加密
上面提到私钥加密需要一个共享的密钥那么如何传递密钥呢?web环境下直接传递的话很容易被侦听到幸好有了公钥加密的出现公钥加密也叫不对称加密不对称算法使用一对密钥对一个公钥一个私钥使用公钥加密的数据只有私钥能解开(可用于加密)同时使用私钥加密的数据只有公钥能解开(签名)但是速度很慢(比私钥加密慢到倍)公钥的主要算法有RSA还包括Blowfish Diffie Helman等 jdk种提供了对RSA的支持是一个改进的地方
/***PublicExample java*Copyright*/ import java security Key; import javax crypto Cipher; import java security KeyPairGenerator; import java security KeyPair;/***一个简单的公鈅加密例子 Cipher类使用KeyPairGenerator生成的公鈅和私鈅*/ public class PublicExample{ public static void main(String[] args) throws Exception{ if(args length!=){ System err println( Usage:java PublicExample<text>); System exit();}
byte[] plainText=args[ ] getBytes( UTF);//构成一个RSA密钥 System out println( \nStart generating RSA key); KeyPairGenerator keyGen=KeyPairGenerator getInstance( RSA); keyGen initialize(); KeyPair key=keyGen generateKeyPair(); System out println( Finish generating RSA key);
//获得一个RSA的Cipher类使用公鈅加密 Cipher cipher=Cipher getInstance( RSA/ECB/PKCS Padding); System out println( \n+cipher getProvider() getInfo());
System out println( \nStart encryption); cipher init(Cipher ENCRYPT_MODE key getPublic()); byte[] cipherText=cipher doFinal(plainText); System out println( Finish encryption:); System out println(new String(cipherText UTF));
lishixinzhi/Article/program/Java/hx/201311/26898java用md5密码加密有必要吗
F4813E1D0AF19C455AA572E092724C82
你把这个MD5给我破解一下。
MD5的转换是不可逆的,系统把你输入的密码转换成MD5字符串,但没有人可以把MD5字符串再转换成你的密码。数据库里面存的就是MD5字符串,验证的时候把用户输入的密码转换成MD5字符串和数据库里面的数据进行比较。所以说连数据库管理员都不知道你的密码。
好了,关于java加密用在什么地方和java加密的几种方式的问题到这里结束啦,希望可以解决您的问题哈!