java代碼加密,java代碼加密混淆工具

本文目錄一覽:

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-tw/n/143999.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
YYAK的頭像YYAK
上一篇 2024-10-24 15:27
下一篇 2024-10-24 15:27

相關推薦

  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Python字元串寬度不限制怎麼打代碼

    本文將為大家詳細介紹Python字元串寬度不限制時如何打代碼的幾個方面。 一、保持代碼風格的統一 在Python字元串寬度不限制的情況下,我們可以寫出很長很長的一行代碼。但是,為了…

    編程 2025-04-29
  • Java Bean載入過程

    Java Bean載入過程涉及到類載入器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean載入的過程。 一、類載入器 類載入器是Java虛擬機…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Python基礎代碼用法介紹

    本文將從多個方面對Python基礎代碼進行解析和詳細闡述,力求讓讀者深刻理解Python基礎代碼。通過本文的學習,相信大家對Python的學習和應用會更加輕鬆和高效。 一、變數和數…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29

發表回復

登錄後才能評論