鏈枃涓昏璋堜竴涓嬪瘑鐮佸涓殑鍔犲瘑鍜屾暟瀛楃鍚嶏紝浠ュ強鍏跺湪java涓浣曡繘琛屼嬌鐢ㄣ傚瀵嗙爜瀛︽湁鍏磋叮鐨勪紮浼達紝鎺ㄨ崘鐪?
Bruce Schneier鐨勮憲浣滐細Applied
Crypotography銆傚湪jdk1.5鐨勫彂琛岀増鏈腑瀹夊叏鎬ф柟闈㈡湁浜嗗緢澶х殑鏀硅繘錛屼篃鎻愪緵浜嗗RSA綆楁硶鐨勭洿鎺ユ敮鎸侊紝鐜板湪鎴戜滑浠庡疄渚嬪叆鎵嬭В鍐抽棶棰橈紙鏈枃
浠呮槸浣滀負綆鍗曚粙緇嶏級錛?
銆銆涓銆佸瘑鐮佸涓婂父鐢ㄧ殑姒傚康銆
銆銆1錛夋秷鎭憳瑕侊細
銆
銆榪欐槸涓縐嶄笌娑堟伅璁よ瘉鐮佺粨鍚堜嬌鐢ㄤ互紜繚娑堟伅瀹屾暣鎬х殑鎶鏈備富瑕佷嬌鐢ㄥ崟鍚戞暎鍒楀嚱鏁扮畻娉曪紝鍙敤浜庢楠屾秷鎭殑瀹屾暣鎬э紝鍜岄氳繃鏁e垪瀵嗙爜鐩存帴浠ユ枃鏈艦寮忎繚瀛樼瓑錛岀洰鍓?
騫挎硾浣跨敤鐨勭畻娉曟湁MD4銆丮D5銆丼HA-1錛宩dk1.5瀵逛笂闈㈤兘鎻愪緵浜嗘敮鎸侊紝鍦╦ava涓繘琛屾秷鎭憳瑕佸緢綆鍗曪紝
java.security.MessageDigest鎻愪緵浜嗕竴涓畝鏄撶殑鎿嶄綔鏂規硶錛?br />
/**
*MessageDigestExample.java
*Copyright聽2005-2-16
*/
import聽java.security.MessageDigest;
/**
*鍗曚竴鐨勬秷鎭憳瑕佺畻娉曪紝涓嶄嬌鐢ㄥ瘑鐮?鍙互鐢ㄦ潵瀵規槑鏂囨秷鎭紙濡傦細瀵嗙爜錛夐殣钘忎繚瀛?br />*/
public聽class聽MessageDigestExample{
銆public聽static聽void聽main(String[]聽args)聽throws聽Exception{
銆銆if(args.length!=1){
銆銆銆System.err.println("Usage:java聽MessageDigestExample聽text");
銆銆銆System.exit(1);
銆銆}
銆銆byte[]聽plainText=args[0].getBytes("UTF8");
銆銆//浣跨敤getInstance("綆楁硶")鏉ヨ幏寰楁秷鎭憳瑕?榪欓噷浣跨敤SHA-1鐨?60浣嶇畻娉?/span>
銆銆MessageDigest聽messageDigest=MessageDigest.getInstance("SHA-1");
銆銆System.out.println("\n"+messageDigest.getProvider().getInfo());
銆銆//寮濮嬩嬌鐢ㄧ畻娉?/span>
銆銆messageDigest.update(plainText);
銆銆System.out.println("\nDigest:");
銆銆//杈撳嚭綆楁硶榪愮畻緇撴灉
銆銆System.out.println(new聽String(messageDigest.digest(),"UTF8"));
銆}
}
銆銆榪樺彲浠ラ氳繃娑堟伅璁よ瘉鐮佹潵榪涜鍔犲瘑瀹炵幇錛宩avax.crypto.Mac鎻愪緵浜嗕竴涓В鍐蟲柟妗堬紝鏈夊叴瓚h呭彲浠ュ弬鑰冪浉鍏矨PI鏂囨。錛屾湰鏂囧彧鏄畝鍗曚粙緇嶄粈涔堟槸鎽樿綆楁硶銆?br />
榪欓噷琛ュ厖鍙︿竴涓繍鐢ㄦ秷鎭憳瑕佺殑鏂瑰紡鍔犲瘑鐨勪緥瀛?
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聽"MD5"
聽聽聽聽聽*聽@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聽=聽"MD5";
聽聽聽聽聽聽聽聽聽聽聽聽}
聽聽聽聽聽聽聽聽聽聽聽聽md聽=聽MessageDigest.getInstance(encName);
聽聽聽聽聽聽聽聽聽聽聽聽md.update(bt);
聽聽聽聽聽聽聽聽聽聽聽聽strDes聽=聽bytes2Hex(md.digest());聽//to聽HexString
聽聽聽聽聽聽聽聽}
聽聽聽聽聽聽聽聽catch聽(NoSuchAlgorithmException聽e)聽{
聽聽聽聽聽聽聽聽聽聽聽聽System.out.println("Invalid聽algorithm.");
聽聽聽聽聽聽聽聽聽聽聽聽return聽null;
聽聽聽聽聽聽聽聽}
聽聽聽聽聽聽聽聽return聽strDes;
聽聽聽聽}
聽聽聽聽public聽String聽bytes2Hex(byte[]聽bts)聽{
聽聽聽聽聽聽聽聽String聽des聽=聽"";
聽聽聽聽聽聽聽聽String聽tmp聽=聽null;
聽聽聽聽聽聽聽聽for聽(int聽i聽=聽0;聽i聽<聽bts.length;聽i++)聽{
聽聽聽聽聽聽聽聽聽聽聽聽tmp聽=聽(Integer.toHexString(bts[i]聽&聽0xFF));
聽聽聽聽聽聽聽聽聽聽聽聽if聽(tmp.length()聽==聽1)聽{
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽des聽+=聽"0";
聽聽聽聽聽聽聽聽聽聽聽聽}
聽聽聽聽聽聽聽聽聽聽聽聽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聽MD5:"聽+聽te.Encrypt(strSrc,聽"MD5"));
聽聽聽聽聽聽聽聽System.out.println("Use聽SHA:"聽+聽te.Encrypt(strSrc,聽"SHA-1"));
聽聽聽聽聽聽聽聽System.out.println("Use聽SHA-256:"聽+聽te.Encrypt(strSrc,聽"SHA-256"));
聽聽聽聽}
}
鍙﹀錛屽湪javawebparts涓殑 RequestHelpers閲岀殑generateGUID鏂規硶涔熸秹鍙婂埌浜哅D5鐨勬柟娉曪紝浠g爜濡備笅:
public聽static聽String聽generateGUID(HttpServletRequest聽request)聽{
聽聽聽聽String聽out聽=聽"";
聽聽聽聽try聽{
聽聽聽聽聽聽//聽Construct聽a聽string聽that聽is聽comprised聽of:
聽聽聽聽聽聽//聽Remote聽IP聽Address聽+聽Host聽IP聽Address聽+聽Date聽(yyyyMMdd)聽+
聽聽聽聽聽聽//聽Time聽(hhmmssSSa)聽+聽Requested聽Path聽+聽Session聽ID聽+
聽聽聽聽聽聽//聽HashCode聽Of聽ParameterMap
聽聽聽聽聽聽StringBuffer聽sb聽=聽new聽StringBuffer(1024);
聽聽聽聽聽聽sb.append(request.getRemoteAddr());
聽聽聽聽聽聽InetAddress聽ia聽=聽InetAddress.getLocalHost();
聽聽聽聽聽聽sb.append(ia.getHostAddress());
聽聽聽聽聽聽sb.append(new聽SimpleDateFormat("yyyyMMddhhmmssSSa").format(new聽Date()));
聽聽聽聽聽聽String聽path聽=聽request.getServletPath();
聽聽聽聽聽聽String聽pathInfo聽=聽request.getPathInfo();
聽聽聽聽聽聽if聽(pathInfo聽!=聽null)聽{
聽聽聽聽聽聽聽聽path聽+=聽pathInfo;
聽聽聽聽聽聽}
聽聽聽聽聽聽sb.append(path);
聽聽聽聽聽聽sb.append(request.getSession(false));
聽聽聽聽聽聽sb.append(request.getParameterMap().hashCode());
聽聽聽聽聽聽String聽str聽=聽sb.toString();
聽聽聽聽聽聽//聽Now聽encode聽the聽string聽using聽an聽MD5聽encryption聽algorithm.
聽聽聽聽聽聽MessageDigest聽md聽=聽MessageDigest.getInstance("md5");
聽聽聽聽聽聽md.update(str.getBytes());
聽聽聽聽聽聽byte[]聽digest聽=聽md.digest();
聽聽聽聽聽聽StringBuffer聽hexStr聽=聽new聽StringBuffer(1024);
聽聽聽聽聽聽for聽(int聽i聽=聽0;聽i聽<聽digest.length;聽i++)聽{
聽聽聽聽聽聽聽聽str聽=聽Integer.toHexString(0xFF聽&聽digest[i]);
聽聽聽聽聽聽聽聽if聽(str.length()聽<聽2)聽{
聽聽聽聽聽聽聽聽聽聽str聽=聽"0"聽+聽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
聽聽聽聽//聽components聽that聽comprise聽the聽plain聽text聽string,聽and聽should聽always聽be
聽聽聽聽//聽32聽characters聽thanks聽to聽the聽MD5聽algorithm.
聽聽聽聽return聽out;
聽聽}聽//聽End聽generateGUID().
銆銆2錛夌閽ュ姞瀵嗭細
銆銆娑堟伅鎽樿鍙兘媯鏌ユ秷鎭殑瀹屾暣鎬э紝浣嗘槸鍗曞悜鐨勶紝瀵規槑鏂囨秷鎭茍涓嶈兘鍔犲瘑錛岃鍔犲瘑鏄庢枃鐨勬秷鎭殑璇濓紝灝辮浣跨敤鍏朵粬鐨勭畻娉曪紝瑕佺‘淇濇満瀵嗘э紝鎴戜滑闇瑕佷嬌鐢ㄧ閽ュ瘑鐮佹湳鏉ヤ氦鎹㈢鏈夋秷鎭?br />
銆銆榪欑鏈濂界悊瑙o紝浣跨敤瀵圭О綆楁硶銆傛瘮濡傦細A鐢ㄤ竴涓瘑閽ュ涓涓枃浠跺姞瀵嗭紝鑰孊璇誨彇榪欎釜鏂囦歡鐨勮瘽錛屽垯闇瑕佸拰A涓鏍風殑瀵嗛挜錛屽弻鏂瑰叡浜竴涓閽ワ紙鑰屽湪web鐜涓嬶紝縐侀挜鍦ㄤ紶閫掓椂瀹規槗琚睛鍚級錛?br />
銆
銆浣跨敤縐侀挜鍔犲瘑鐨勮瘽錛岄鍏堥渶瑕佷竴涓瘑閽ワ紝鍙敤javax.crypto.KeyGenerator浜х敓涓涓瘑閽?java.security.Key),
鐒跺悗浼犻掔粰涓涓姞瀵嗗伐鍏?javax.crypto.Cipher),璇ュ伐鍏峰啀浣跨敤鐩稿簲鐨勭畻娉曟潵榪涜鍔犲瘑錛屼富瑕佸縐扮畻娉曟湁錛欴ES錛堝疄闄呭瘑閽ュ彧鐢ㄥ埌56
浣嶏級錛孉ES錛堟敮鎸佷笁縐嶅瘑閽ラ暱搴︼細128銆?92銆?56浣嶏級錛岄氬父棣栧厛128浣嶏紝鍏朵粬鐨勮繕鏈塂ESede絳夛紝jdk1.5縐嶄篃鎻愪緵浜嗗瀵圭О綆楁硶鐨勬敮鎸侊紝
浠ヤ笅渚嬪瓙浣跨敤AES綆楁硶鏉ュ姞瀵嗭細
/**
*PrivateExmaple.java
*Copyright聽2005-2-16
*/
import聽javax.crypto.Cipher;
import聽javax.crypto.KeyGenerator;
import聽java.security.Key;
/**
*縐侀垍鍔犲瘑錛屼繚璇佹秷鎭満瀵嗘?br />*/
public聽class聽PrivateExample{
銆public聽static聽void聽main(String[]聽args)聽throws聽Exception{
銆銆if(args.length!=1){
銆銆銆System.err.println("Usage:java聽PrivateExample聽<text>");
銆銆銆System.exit(1);
銆銆}
銆銆byte[]聽plainText=args[0].getBytes("UTF8");
銆銆//閫氳繃KeyGenerator褰㈡垚涓涓猭ey
銆銆System.out.println("\nStart聽generate聽AES聽key");
銆銆KeyGenerator聽keyGen=KeyGenerator.getInstance("AES");
銆銆keyGen.init(128);
銆銆Key聽key=keyGen.generateKey();
銆銆System.out.println("Finish聽generating聽DES聽key");
銆銆//鑾峰緱涓涓閳呭姞瀵嗙被Cipher錛孍CB鏄姞瀵嗘柟寮忥紝PKCS5Padding鏄~鍏呮柟娉?/span>
銆銆Cipher聽cipher=Cipher.getInstance("AES/ECB/PKCS5Padding");
銆銆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,"UTF8"));
銆銆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,"UTF8"));
銆}
}
銆銆3錛夊叕閽ュ姞瀵嗭細
銆
銆涓婇潰鎻愬埌錛岀閽ュ姞瀵嗛渶瑕佷竴涓叡浜殑瀵嗛挜錛岄偅涔堝浣曚紶閫掑瘑閽ュ憿錛焪eb鐜涓嬶紝鐩存帴浼犻掔殑璇濆緢瀹規槗琚睛鍚埌錛屽垢濂芥湁浜嗗叕閽ュ姞瀵嗙殑鍑虹幇銆傚叕閽ュ姞瀵嗕篃鍙笉瀵圭О
鍔犲瘑錛屼笉瀵圭О綆楁硶浣跨敤涓瀵瑰瘑閽ュ錛屼竴涓叕閽ワ紝涓涓閽ワ紝浣跨敤鍏挜鍔犲瘑鐨勬暟鎹紝鍙湁縐侀挜鑳借В寮錛堝彲鐢ㄤ簬鍔犲瘑錛夛紱鍚屾椂錛屼嬌鐢ㄧ閽ュ姞瀵嗙殑鏁版嵁錛屽彧鏈夊叕閽ヨ兘瑙e紑
錛堢鍚嶏級銆備絾鏄熷害寰堟參錛堟瘮縐侀挜鍔犲瘑鎱?00鍒?000鍊嶏級錛屽叕閽ョ殑涓昏綆楁硶鏈塕SA錛岃繕鍖呮嫭Blowfish,Diffie-Helman絳夛紝
jdk1.5縐嶆彁渚涗簡瀵筊SA鐨勬敮鎸侊紝鏄竴涓敼榪涚殑鍦版柟錛?
/**
*PublicExample.java
*Copyright聽2005-2-16
*/
import聽java.security.Key;
import聽javax.crypto.Cipher;
import聽java.security.KeyPairGenerator;
import聽java.security.KeyPair;
/**
*涓涓畝鍗曠殑鍏垍鍔犲瘑渚嬪瓙,Cipher綾諱嬌鐢↘eyPairGenerator鐢熸垚鐨勫叕閳呭拰縐侀垍
*/
public聽class聽PublicExample{
銆public聽static聽void聽main(String[]聽args)聽throws聽Exception{
銆銆if(args.length!=1){
銆銆銆System.err.println("Usage:java聽PublicExample聽<text>");
銆銆銆System.exit(1);
銆銆}
銆銆byte[]聽plainText=args[0].getBytes("UTF8");
銆銆//鏋勬垚涓涓猂SA瀵嗛挜
銆銆System.out.println("\nStart聽generating聽RSA聽key");
銆銆KeyPairGenerator聽keyGen=KeyPairGenerator.getInstance("RSA");
銆銆keyGen.initialize(1024);
銆銆KeyPair聽key=keyGen.generateKeyPair();
銆銆System.out.println("Finish聽generating聽RSA聽key");
銆銆//鑾峰緱涓涓猂SA鐨凜ipher綾伙紝浣跨敤鍏垍鍔犲瘑
銆銆Cipher聽cipher=Cipher.getInstance("RSA/ECB/PKCS1Padding");
銆銆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,"UTF8"));
銆銆//浣跨敤縐侀垍瑙e瘑
銆銆System.out.println("\nStart聽decryption");
銆銆cipher.init(Cipher.DECRYPT_MODE,key.getPrivate());
銆銆byte[]聽newPlainText=cipher.doFinal(cipherText);
銆銆System.out.println("Finish聽decryption:");
銆銆System.out.println(new聽String(newPlainText,"UTF8"));
銆}
}

]]>