java資料庫加密
用戶提供的是明文,資料庫裡面存儲的是密文
不管怎麼樣,加密也好,解密也好,如果要比較相等性,這兩個過程肯定要有一個,這個是沒有選擇的,需要提高性能的話只能做兩點:
1、將用戶的明文加密為密文後再與資料庫中的比較,原因是這樣只加密一次就可以,如果解密的話就要把資料庫的密文全部解密,這是不現實的
2、在密文所在的列上建立索引,增加搜索速度,這個速度增長是很顯著的,雖然會失去一些插入性能。
3、將對應的sql寫成存儲過程。省去預編譯的時間。這個速度的提高也是很明顯的。
至於你說的「怎麼能保證不一樣得明文加密後生成不一樣得密文」
MD5就可以
MD5有兩個特性:
1、任意兩段明文數據,加密以後的密文不會是相同的
2、任意一段明文數據,經過加密以後,其結果永遠是不變的
網上MD5加密的類應該有寫好的
大致上方法就是這樣了,都做到的話應該沒有問題了,不會影響你的性能的
❷ java 對資料庫properties文件加密
可以通過其它方法來實現:
1:如果沒用框架,直接加密、解密即可
2:如果用hibernate之類,可以繞過Configuration,讀取Hibernate配置文件解密後再連接資料庫
3:考慮集群影響
❸ 用java實現對資料庫文件的加密
自己編寫一個加密演算法,或者在網上找一個MD5的加密演算法,把密碼加密後再存入資料庫,取的時候解密下就可以了
❹ javajdbc連接mysql資料庫如何實現用戶名密碼以及傳輸數據的加密
如果jdbc和mysql都支持SSL那通過配置就可以了x0dx0a如果不支持,那也可以自己來實現。x0dx0a實現思路:x0dx0a1、在資料庫的主機上運行一個java服務,用來轉發數據這個服務我們成為A服務x0dx0a2、客戶端並不直接訪問資料庫,而訪問A服務,客戶端和A服務之間的傳輸代碼由用戶自己完成,當然可以加密。走套接字,走http,或者其他什麼都是可以的。
❺ Java加密方式
這個一般沒有統一的標准,教材有不同的版本一樣。
我做過這個,記得很清楚
加密方式1:Conye加密方法
加密方式2:WeiffbYfds方法
就是這樣了,不懂追問哈,嘻嘻。
❻ java jdbc連接mysql資料庫 如何實現用戶名密碼以及傳輸數據的加密
你的問題很不清晰。
java jdbc連接mysql資料庫
如何實現用戶名密碼以及傳輸數據的加密
你是要加密保存的數據,還是加密連接信息?
如果是連接串中的用戶名與密碼進行加密。恐怕用起來很不方便。
我就當你是要把入庫的信息加密。
下邊是DES加密的方法。將數據進行DES加密,將加密內容轉為16進制內容表示。
--------------------------------------------------------------------------------------------
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
public class DesTest {
public static void main(String[] args) throws Exception {
// 要加密的數據
String str = "123456";
// 密鑰
String strKey = "86337898";
SecretKeySpec key = new SecretKeySpec(strKey.getBytes(), "DES");
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] byteFina = cipher.doFinal(str.getBytes());
String strFinal = byte2Hex(byteFina);
System.out.println(strFinal);
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] decByte = hex2Byte(strFinal);
byte[] result = cipher.doFinal(decByte);
System.out.println(new String(result));
}
public static String byte2Hex(byte[] buff) {
String hs = "";
for (int i = 0; i < buff.length; i++) {
String stmp = (Integer.toHexString(buff[i] & 0XFF));
if (stmp.length() == 1)
hs = hs + "0" + stmp;
else
hs = hs + stmp;
}
return hs;
}
public static byte[] hex2Byte(String str) {
int len = str.length() / 2;
byte[] buff = new byte[len];
int index = 0;
for (int i = 0; i < str.length(); i += 2) {
buff[index++] = (byte) Integer
.parseInt(str.substring(i, i + 2), 16);
}
return buff;
}
}
❼ 深入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 array (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); lishixin/Article/program/Java/hx/201311/25555
❽ java最常用的幾種加密演算法
簡單的Java加密演算法有:
第一種. BASE
Base是網路上最常見的用於傳輸Bit位元組代碼的編碼方式之一,大家可以查看RFC~RFC,上面有MIME的詳細規范。Base編碼可用於在HTTP環境下傳遞較長的標識信息。例如,在Java Persistence系統Hibernate中,就採用了Base來將一個較長的唯一標識符(一般為-bit的UUID)編碼為一個字元串,用作HTTP表單和HTTP GET URL中的參數。在其他應用程序中,也常常需要把二進制數據編碼為適合放在URL(包括隱藏表單域)中的形式。此時,採用Base編碼具有不可讀性,即所編碼的數據不會被人用肉眼所直接看到。
第二種. MD
MD即Message-Digest Algorithm (信息-摘要演算法),用於確保信息傳輸完整一致。是計算機廣泛使用的雜湊演算法之一(又譯摘要演算法、哈希演算法),主流編程語言普遍已有MD實現。將數據(如漢字)運算為另一固定長度值,是雜湊演算法的基礎原理,MD的前身有MD、MD和MD。
MD演算法具有以下特點:
壓縮性:任意長度的數據,算出的MD值長度都是固定的。
容易計算:從原數據計算出MD值很容易。
抗修改性:對原數據進行任何改動,哪怕只修改個位元組,所得到的MD值都有很大區別。
弱抗碰撞:已知原數據和其MD值,想找到一個具有相同MD值的數據(即偽造數據)是非常困難的。
強抗碰撞:想找到兩個不同的數據,使它們具有相同的MD值,是非常困難的。
MD的作用是讓大容量信息在用數字簽名軟體簽署私人密鑰前被」壓縮」成一種保密的格式(就是把一個任意長度的位元組串變換成一定長的十六進制數字串)。除了MD以外,其中比較有名的還有sha-、RIPEMD以及Haval等。
第三種.SHA
安全哈希演算法(Secure Hash Algorithm)主要適用於數字簽名標准(Digital Signature Standard DSS)裡面定義的數字簽名演算法(Digital Signature Algorithm DSA)。對於長度小於^位的消息,SHA會產生一個位的消息摘要。該演算法經過加密專家多年來的發展和改進已日益完善,並被廣泛使用。該演算法的思想是接收一段明文,然後以一種不可逆的方式將它轉換成一段(通常更小)密文,也可以簡單的理解為取一串輸入碼(稱為預映射或信息),並把它們轉化為長度較短、位數固定的輸出序列即散列值(也稱為信息摘要或信息認證代碼)的過程。散列函數值可以說是對明文的一種「指紋」或是「摘要」所以對散列值的數字簽名就可以視為對此明文的數字簽名。
SHA-與MD的比較
因為二者均由MD導出,SHA-和MD彼此很相似。相應的,他們的強度和其他特性也是相似,但還有以下幾點不同:
對強行攻擊的安全性:最顯著和最重要的區別是SHA-摘要比MD摘要長 位。使用強行技術,產生任何一個報文使其摘要等於給定報摘要的難度對MD是^數量級的操作,而對SHA-則是^數量級的操作。這樣,SHA-對強行攻擊有更大的強度。
對密碼分析的安全性:由於MD的設計,易受密碼分析的攻擊,SHA-顯得不易受這樣的攻擊。
速度:在相同的硬體上,SHA-的運行速度比MD慢。
第四種.HMAC
HMAC(Hash Message Authentication Code,散列消息鑒別碼,基於密鑰的Hash演算法的認證協議。消息鑒別碼實現鑒別的原理是,用公開函數和密鑰產生一個固定長度的值作為認證標識,用這個標識鑒別消息的完整性。使用一個密鑰生成一個固定大小的小數據塊,即MAC,並將其加入到消息中,然後傳輸。接收方利用與發送方共享的密鑰進行鑒別認證等。