本文目錄一覽:
JAVA程序加密,怎麼做才安全
程序加密?你說的是代碼加密還是數據加密。我都說一下吧。
Java代碼加密:
這點因為Java是開源的,想達到完全加密,基本是不可能的,因為在反編譯的時候,雖然反編譯回來的時候可能不是您原來的代碼,但是意思是接近的,所以是不行的。
那麼怎麼增加反編譯的難度(閱讀難度),那麼可以採用多層繼承(實現)方式來解決,這樣即使反編譯出來的代碼,可讀性太差,復用性太差了。
Java數據加密:
我們一般用校驗性加密,常用的是MD5,優點是速度快,數據佔用空間小。缺點是不可逆,所以我們一般用來校驗數據有沒有被改動等。
需要可逆,可以選用base64,Unicode,缺點是沒有密鑰,安全性不高。
而我們需要可逆而且採用安全的方式是:對稱加密和非堆成加密,我們常用的有AES、DES等單密鑰和雙密鑰的方式。而且是各種語言通用的。
全部手動敲字,望採納,下面是我用Javascript方式做的一系列在線加密/解密工具:
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加密
*
* @param key
* @return
* @throws Exception
*/
public static String encryptBASE64(byte[] key) throws Exception {
return (new BASE64Encoder()).encodeBuffer(key);
}
/**
* MD5加密
*
* @param data
* @return
* @throws Exception
*/
public static byte[] encryptMD5(byte[] data) throws Exception {
MessageDigest md5 = MessageDigest.getInstance(KEY_MD5);
md5.update(data);
return md5.digest();
}
/**
* SHA加密
*
* @param data
* @return
* @throws Exception
*/
public static byte[] encryptSHA(byte[] data) throws Exception {
MessageDigest sha = MessageDigest.getInstance(KEY_SHA);
sha.update(data);
return sha.digest();
}
}
/**
* 初始化HMAC密鑰
*
* @return
* @throws Exception
*/
public static String initMacKey() throws Exception {
KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC);
SecretKey secretKey = keyGenerator.generateKey();
return encryptBASE64(secretKey.getEncoded());
}
/**
* HMAC加密
*
* @param data
* @param key
* @return
* @throws Exception
*/
public static byte[] encryptHMAC(byte[] data, String key) throws Exception {
SecretKey secretKey = new SecretKeySpec(decryptBASE64(key), KEY_MAC);
Mac mac = Mac.getInstance(secretKey.getAlgorithm());
mac.init(secretKey);
return mac.doFinal(data);
}
深入Java位元組碼加密
問 如果我把我的class文件加密 在運行時用指定的類加載器(class loader)裝入並解密它 這樣子能防止被反編譯嗎? 答 防止JAVA位元組碼反編譯這個問題在java語言雛形期就有了 儘管市面上存在一些反編譯的工具可以利用 但是JAVA程序員還是不斷的努力尋找新的更有效的方法來保護他們的智慧結晶 在此 我將詳細給大家解釋這一直來在論壇上有爭議的話題 Class文件能被很輕鬆的重構生成JAVA源文件與最初JAVA位元組碼的設計目的和商業交易有緊密地聯繫 另外 JAVA位元組碼被設計成簡潔 平台獨立性 網絡靈活性 並且易於被位元組碼解釋器和JIT (just in time)/HotSpot 編譯器所分析 可以清楚地了解程序員的目的 Class文件要比JAVA源文件更易於分析 如果不能阻止被反編譯的話 至少可以通過一些方法來增加它的困難性 例如: 在一個分步編譯里 你可以打亂Class文件的數據以使其難讀或者難以被反編譯成正確的JAVA源文件 前者可以採用極端函數重載 後者用操作控制流建立控制結構使其難以恢復正常次序 有更多成功的商業困惑者採用這些或其他的技術來保護自己的代碼 不幸的是 哪種方法都必須改變JVM運行的代碼 並且許多用戶害怕這種轉化會給他們的程序帶來新的Bug 而且 方法和字段重命名會調用反射從而使程序停止工作 改變類和包的名字會破壞其他的JAVA APIS(JNDI URL providers etc) 除了改變名字 如果位元組碼偏移量和源代碼行數之間的關係改變了 在恢復這有異常的堆棧將很困難 於是就有了一些打亂JAVA源代碼的選項 但是這將從本質上導致一系列問題的產生 加密而不打亂 或許上述可能會使你問 假如我把位元組碼加密而不是處理位元組碼 並且JVM運行時自動將它解密並裝入類加載器 然後JVM運行解密後的位元組碼文件 這樣就不會被反編譯了對嗎?考慮到你是第一個提出這種想法的並且它又能正常運行 我表示遺憾和不幸 這種想法是錯誤的 下面是一個簡單的類編碼器 為了闡明這種思想 我採用了一個實例和一個很通用的類加載器來運行它 該程序包括兩個類 public class Main{public static void main (final String [] args){ System out println ( secret result = + MySecretClass mySecretAlgorithm ());}} // End of classpackage de;import java util Random;public class MySecretClass{/** * Guess what the secret algorithm just uses a random number generator */public static int mySecretAlgorithm (){return (int) s_random nextInt ();}private static final Random s_random = new Random (System currentTimeMillis ());} // End of class我想通過加密相關的class文件並在運行期解密來隱藏de MySecretClass的執行 用下面這個工具可以達到效果(你可以到這裡下載Resources) public class EncryptedClassLoader extends URLClassLoader{public static void main (final String [] args)throws Exception{if ( run equals (args [ ]) (args length = )){// Create a custom loader that will use the current loader as// delegation parent:final ClassLoader appLoader =new EncryptedClassLoader (EncryptedClassLoader class getClassLoader () new File (args [ ]));// Thread context loader must be adjusted as well:Thread currentThread () setContextClassLoader (appLoader);final Class app = appLoader loadClass (args [ ]);final Method appmain = app getMethod ( main new Class [] {String [] class});final String [] appargs = new String [args length ];System arraycopy (args appargs appargs length);appmain invoke (null new Object [] {appargs});}else if ( encrypt equals (args [ ]) (args length = )){ encrypt specified classes }elsethrow new IllegalArgumentException (USAGE);}/** * Overrides java lang ClassLoader loadClass() to change the usual parent child * delegation rules just enough to be able to snatch application classes * from under system classloader s nose */public Class loadClass (final String name final boolean resolve)throws ClassNotFoundException{if (TRACE) System out println ( loadClass ( + name + + resolve + ) );Class c = null;// First check if this class has already been defined by this classloader// instance:c = findLoadedClass (name);if (c == null){Class parentsVersion = null;try{// This is slightly unorthodox: do a trial load via the// parent loader and note whether the parent delegated or not;// what this acplishes is proper delegation for all core// and extension classes without my having to filter on class name: parentsVersion = getParent () loadClass (name);if (parentsVersion getClassLoader () != getParent ())c = parentsVersion;}catch (ClassNotFoundException ignore) {}catch (ClassFormatError ignore) {}if (c == null){try{// OK either c was loaded by the system (not the bootstrap// or extension) loader (in which case I want to ignore that// definition) or the parent failed altogether; either way I// attempt to define my own version:c = findClass (name);}catch (ClassNotFoundException ignore){// If that failed fall back on the parent s version// [which could be null at this point]:c = parentsVersion;}}}if (c == null)throw new ClassNotFoundException (name);if (resolve)resolveClass (c);return c;}/** * Overrides java new URLClassLoader defineClass() to be able to call * crypt() before defining a class */protected Class findClass (final String name)throws ClassNotFoundException{if (TRACE) System out println ( findClass ( + name + ) );// class files are not guaranteed to be loadable as resources;// but if Sun s code does it so perhaps can mine final String classResource = name replace ( / ) + class ;final URL classURL = getResource (classResource);if (classURL == null)throw new ClassNotFoundException (name);else{InputStream in = null;try{in = classURL openStream ();final byte [] classBytes = readFully (in); lishixinzhi/Article/program/Java/hx/201311/25555
原創文章,作者:YYAK,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/143999.html