Java实现DES加密与解密,md5加密以及Java实现MD5加密解密类
很多时候要对秘要进行持久化加密,此时的加密采用md5。采用对称加密的时候就采用DES方法了
importjava.io.IOException; importjava.security.MessageDigest; importjava.security.SecureRandom; importjavax.crypto.Cipher; importjavax.crypto.SecretKey; importjavax.crypto.SecretKeyFactory; importjavax.crypto.spec.DESKeySpec; importsun.misc.BASEDecoder; importsun.misc.BASEEncoder; /** *密匙工具类(包含des加密与md加密) *@authormingge * */ publicclassKeysUtil{ privatefinalstaticStringDES="DES"; privatefinalstaticStringMD="MD"; privatefinalstaticStringKEY="opeddsaeaddadbcabf"; /** *MD加密算法 *@paramdata *@return */ publicstaticStringmdEncrypt(Stringdata){ StringresultString=null; try{ resultString=newString(data); MessageDigestmd=MessageDigest.getInstance(MD); resultString=bytehexString(md.digest(resultString.getBytes())); }catch(Exceptionex){ } returnresultString; } privatestaticStringbytehexString(byte[]bytes){ StringBufferbf=newStringBuffer(bytes.length*); for(inti=;i<bytes.length;i++){ if((bytes[i]&xff)<x){ bf.append("T"); } bf.append(Long.toString(bytes[i]&xff,)); } returnbf.toString(); } /** *Description根据键值进行加密 *@paramdata *@paramkey加密键byte数组 *@return *@throwsException */ publicstaticStringdesEncrypt(Stringdata,Stringkey)throwsException{ if(key==null){ key=KEY; } byte[]bt=encrypt(data.getBytes(),key.getBytes()); Stringstrs=newBASEEncoder().encode(bt); returnstrs; } /** *Description根据键值进行解密 *@paramdata *@paramkey加密键byte数组 *@return *@throwsIOException *@throwsException */ publicstaticStringdesDecrypt(Stringdata,Stringkey)throwsIOException, Exception{ if(data==null){ returnnull; } if(key==null){ key=KEY; } BASEDecoderdecoder=newBASEDecoder(); byte[]buf=decoder.decodeBuffer(data); byte[]bt=decrypt(buf,key.getBytes()); returnnewString(bt); } /** *Description根据键值进行加密 *@paramdata *@paramkey加密键byte数组 *@return *@throwsException */ privatestaticbyte[]encrypt(byte[]data,byte[]key)throwsException{ //生成一个可信任的随机数源 SecureRandomsr=newSecureRandom(); //从原始密钥数据创建DESKeySpec对象 DESKeySpecdks=newDESKeySpec(key); //创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象 SecretKeyFactorykeyFactory=SecretKeyFactory.getInstance(DES); SecretKeysecurekey=keyFactory.generateSecret(dks); //Cipher对象实际完成加密操作 Ciphercipher=Cipher.getInstance(DES); //用密钥初始化Cipher对象 cipher.init(Cipher.ENCRYPT_MODE,securekey,sr); returncipher.doFinal(data); } /** *Description根据键值进行解密 *@paramdata *@paramkey加密键byte数组 *@return *@throwsException */ privatestaticbyte[]decrypt(byte[]data,byte[]key)throwsException{ //生成一个可信任的随机数源 SecureRandomsr=newSecureRandom(); //从原始密钥数据创建DESKeySpec对象 DESKeySpecdks=newDESKeySpec(key); //创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象 SecretKeyFactorykeyFactory=SecretKeyFactory.getInstance(DES); SecretKeysecurekey=keyFactory.generateSecret(dks); //Cipher对象实际完成解密操作 Ciphercipher=Cipher.getInstance(DES); //用密钥初始化Cipher对象 cipher.init(Cipher.DECRYPT_MODE,securekey,sr); returncipher.doFinal(data); } }
下面在给大家介绍一段代码关于Java实现MD5加密解密类
Java实现MD5加密以及解密类,附带测试类,具体见代码。
MD5加密解密类——MyMD5Util,代码如下:
packagecom.zyg.security.md5; importjava.io.UnsupportedEncodingException; importjava.security.MessageDigest; importjava.security.NoSuchAlgorithmException; importjava.security.SecureRandom; importjava.util.Arrays; publicclassMyMD5Util{ privatestaticfinalStringHEX_NUMS_STR="0123456789ABCDEF"; privatestaticfinalIntegerSALT_LENGTH=12; /** *将16进制字符串转换成字节数组 *@paramhex *@return */ publicstaticbyte[]hexStringToByte(Stringhex){ intlen=(hex.length()/2); byte[]result=newbyte[len]; char[]hexChars=hex.toCharArray(); for(inti=0;i<len;i++){ intpos=i*2; result[i]=(byte)(HEX_NUMS_STR.indexOf(hexChars[pos])<<4 |HEX_NUMS_STR.indexOf(hexChars[pos+1])); } returnresult; } /** *将指定byte数组转换成16进制字符串 *@paramb *@return */ publicstaticStringbyteToHexString(byte[]b){ StringBufferhexString=newStringBuffer(); for(inti=0;i<b.length;i++){ Stringhex=Integer.toHexString(b[i]&0xFF); if(hex.length()==1){ hex='0'+hex; } hexString.append(hex.toUpperCase()); } returnhexString.toString(); } /** *验证口令是否合法 *@parampassword *@parampasswordInDb *@return *@throwsNoSuchAlgorithmException *@throwsUnsupportedEncodingException */ publicstaticbooleanvalidPassword(Stringpassword,StringpasswordInDb) throwsNoSuchAlgorithmException,UnsupportedEncodingException{ //将16进制字符串格式口令转换成字节数组 byte[]pwdInDb=hexStringToByte(passwordInDb); //声明盐变量 byte[]salt=newbyte[SALT_LENGTH]; //将盐从数据库中保存的口令字节数组中提取出来 System.arraycopy(pwdInDb,0,salt,0,SALT_LENGTH); //创建消息摘要对象 MessageDigestmd=MessageDigest.getInstance("MD5"); //将盐数据传入消息摘要对象 md.update(salt); //将口令的数据传给消息摘要对象 md.update(password.getBytes("UTF-8")); //生成输入口令的消息摘要 byte[]digest=md.digest(); //声明一个保存数据库中口令消息摘要的变量 byte[]digestInDb=newbyte[pwdInDb.length-SALT_LENGTH]; //取得数据库中口令的消息摘要 System.arraycopy(pwdInDb,SALT_LENGTH,digestInDb,0,digestInDb.length); //比较根据输入口令生成的消息摘要和数据库中消息摘要是否相同 if(Arrays.equals(digest,digestInDb)){ //口令正确返回口令匹配消息 returntrue; }else{ //口令不正确返回口令不匹配消息 returnfalse; } } /** *获得加密后的16进制形式口令 *@parampassword *@return *@throwsNoSuchAlgorithmException *@throwsUnsupportedEncodingException */ publicstaticStringgetEncryptedPwd(Stringpassword) throwsNoSuchAlgorithmException,UnsupportedEncodingException{ //声明加密后的口令数组变量 byte[]pwd=null; //随机数生成器 SecureRandomrandom=newSecureRandom(); //声明盐数组变量 byte[]salt=newbyte[SALT_LENGTH]; //将随机数放入盐变量中 random.nextBytes(salt); //声明消息摘要对象 MessageDigestmd=null; //创建消息摘要 md=MessageDigest.getInstance("MD5"); //将盐数据传入消息摘要对象 md.update(salt); //将口令的数据传给消息摘要对象 md.update(password.getBytes("UTF-8")); //获得消息摘要的字节数组 byte[]digest=md.digest(); //因为要在口令的字节数组中存放盐,所以加上盐的字节长度 pwd=newbyte[digest.length+SALT_LENGTH]; //将盐的字节拷贝到生成的加密口令字节数组的前12个字节,以便在验证口令时取出盐 System.arraycopy(salt,0,pwd,0,SALT_LENGTH); //将消息摘要拷贝到加密口令字节数组从第13个字节开始的字节 System.arraycopy(digest,0,pwd,SALT_LENGTH,digest.length); //将字节数组格式加密后的口令转化为16进制字符串格式的口令 returnbyteToHexString(pwd); } }
测试类——Client,代码如下:
packagecom.zyg.security.md5; importjava.io.UnsupportedEncodingException; importjava.security.NoSuchAlgorithmException; importjava.util.HashMap; importjava.util.Map; publicclassClient{ privatestaticMapusers=newHashMap(); publicstaticvoidmain(String[]args){ StringuserName="zyg"; Stringpassword="123"; registerUser(userName,password); userName="changong"; password="456"; registerUser(userName,password); StringloginUserId="zyg"; Stringpwd="1232"; try{ if(loginValid(loginUserId,pwd)){ System.out.println("欢迎登陆!!!"); }else{ System.out.println("口令错误,请重新输入!!!"); } }catch(NoSuchAlgorithmExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }catch(UnsupportedEncodingExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } /** *注册用户 * *@paramuserName *@parampassword */ publicstaticvoidregisterUser(StringuserName,Stringpassword){ StringencryptedPwd=null; try{ encryptedPwd=MyMD5Util.getEncryptedPwd(password); users.put(userName,encryptedPwd); }catch(NoSuchAlgorithmExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }catch(UnsupportedEncodingExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } /** *验证登陆 * *@paramuserName *@parampassword *@return *@throwsUnsupportedEncodingException *@throwsNoSuchAlgorithmException */ publicstaticbooleanloginValid(StringuserName,Stringpassword) throwsNoSuchAlgorithmException,UnsupportedEncodingException{ StringpwdInDb=(String)users.get(userName); if(null!=pwdInDb){//该用户存在 returnMyMD5Util.validPassword(password,pwdInDb); }else{ System.out.println("不存在该用户!!!"); returnfalse; } } }