1. 怎麼對資料庫已有的數據進行加密
第一層 服務主密鑰 備份服務主密鑰
backup service master key to file='c:\smk.bak'
encryption by password='P@ssw0rd'
restore service master key from file='c:\smk.bak'
decryption by password='P@ssw0rd'
第二層 資料庫主密鑰
1)必須先在該資料庫上創建資料庫主密鑰才能使用
create master key encryption by password='P@ssw0rd'
2)使用資料庫主密鑰
-如果資料庫主密鑰使用服務密鑰進行保護,則在使用時會自動打開
opren master key decryption by password='P@ssw0rd'
3)查看資料庫主密鑰狀態
sys.symmetric_keys
4)備份資料庫主密鑰
backup master key to file='c:\smk.bak'
encryption by password='P@ssw0rd'
restore master key from file='c:\smk.bak'
decryption by password='P@ssw0rd'
2. 系統數據安全
部分航空物探項目是帶有一定密級的,其項目所取得的成果資料屬於保密數據,這部分數據也存儲在本系統的資料庫中。因此,需防止保密數據被竊走或蓄意破壞,如越權提取資料庫保密數據或在通信線路上進行竊聽等。對這樣的威脅最有效的解決方法就是對數據進行加密處理,把可讀的保密數據轉化為密碼數據,以加密格式存儲和傳輸,在使用時再解密。
航空物探保密項目的密級分機密、秘密、絕密3個密級。本系統僅對保密項目數據進行加密處理,機密和秘密項目資料採用64位密鑰進行加密,絕密項目資料採用128位密鑰進行加密,非保密項目數據不做任何加密處理。進入資料採集庫中的數據通過正確性檢查後,歸檔入庫進入資料庫時,系統根據設置的項目密級進行自動加密。用戶也可以通過加密-解密功能對資料庫中的數據進行加密或解密。相同類型的加密數據與未加密數據均存儲在資料庫同一張表的同一欄位中,但在數據加密-解密記錄表資料庫(表3-8)中,記錄了加密資料庫表代碼和欄位代碼。當用戶獲得授權訪問保密數據時,系統根據該表中的記錄自動對數據進行解密。
表3-8 數據加密-解密記錄表資料庫結構
一、數據加密與解密
根據密鑰類型不同將現代密碼技術分為兩類:對稱加密演算法(秘密鑰匙加密)和非對稱加密演算法(公開密鑰加密)。對稱鑰匙加密系統是加密和解密均採用同一把秘密鑰匙,而且通信雙方都必須獲得這把鑰匙,並保持鑰匙的秘密。非對稱密鑰加密系統採用的加密鑰匙(公鑰)和解密鑰匙(私鑰)是不同的。
對稱加密演算法用來對敏感數據等信息進行加密,常用的演算法包括:DES(Data En-cryption Standard),數據加密標准,速度較快,適用於加密大量數據的場合;3DES(Triple DES),是基於DES,對一塊數據用三個不同的密鑰進行三次加密,強度更高;AES(Advanced Encryption Standard),高級加密標准,速度快,安全級別高。常見的非對稱加密演算法有:RSA,由RSA公司發明,是一個支持變長密鑰的公共密鑰演算法,需要加密的文件快的長度也是可變的;DSA(Digital Signature Algorithm),數字簽名演算法,是一種標準的DSS(數字簽名標准)。
本系統採用AES和DES加密演算法對資料庫數據進行加算或解密(圖3-4)。
圖3-4 資料庫數據加密-解密過程
AES加密演算法是美國國家標准和技術協會(NIST)2000年10月宣布通過從15種候選加密演算法中選出的一項新的密鑰加密標准,於2002年5月26日制定了新的高級加密標准(AES)規范。
AES演算法基於排列(對數據重新進行安排)和置換(將一個數據單元替換為另一個)運算,採用幾種不同的方法來執行排列和置換運算。它是一個迭代的、對稱密鑰分組的密碼,可以使用128、192和256位密鑰,並且用128位(16位元組)分組加密和解密,數據通過分組密碼返回的加密數據的位數與輸入數據相同。迭代加密使用一個循環結構,在該循環中重復置換和替換輸入數據。
DES演算法把64位的明文輸入塊變為64位的密文輸出塊,它所使用的密鑰也是64位。首先,DES把輸入的64位數據塊按位重新組合,並把輸出分為L0、R0兩部分,每部分各長32位,並進行前後置換(輸入的第58位換到第一位,第50位換到第2位,依此類推,最後一位是原來的第7位),最終由L0輸出左32位,R0輸出右32位。根據這個法則經過16次迭代運算後,得到L16、R16,將此作為輸入,進行與初始置換相反的逆置換,即得到密文輸出。
二、日誌跟蹤
為了有效地監控航空物探保密數據的訪問,確保保密數據安全,本系統針對保密數據開發了保密數據訪問日誌跟蹤功能。該功能類似於「攝像機」,把訪問資料庫中保密數據的時間、用戶、IP地址等信息記錄在資料庫的日誌庫表中,以備偵查。
首先,對保密數據進行日誌跟蹤定義,即對用戶的哪些操作進行跟蹤。系統提供了對用戶的查詢、新增、修改、刪除4種操作進行跟蹤功能,可以根據需要進行選擇其一或多個(圖3-5)。
日誌跟蹤定義生效後,系統自動對用戶實施跟蹤,並記錄用戶登錄名、登錄和退出時間(年/月/日,時/分/秒)、登錄計算機的IP地址,用戶對資料庫數據所進行的查詢、新增、修改、刪除操作。系統還提供了跟蹤日誌記錄查詢、列印、導出Excel表格文件等功能,便於資料庫管理人員使用。
圖3-5 資料庫日誌跟蹤設置
三、數據提取安全機制
數據提取是航空物探信息系統向地質、地球物理等領域的科研人員提供數據服務的重要內容之一。防止越權提取數據,保證數據安全,是本系統提供優質、高效服務的前提。
越權提取數據是兩個方面的問題。一是用戶在沒有獲得授權情況竊取數據,此問題屬系統使用安全。二是獲得授權的用戶擅自擴大提取數據的范圍,「順手牽羊」多提取數據。針對該問題,本系統採用以下機制(圖3-6)。
圖3-6 資料庫數據提取安全機制模型
首先由用戶(需要數據的單位或個人)提出使用數據申請,填寫使用數據審批表。該表包含申請號、申請人、使用數據的范圍(經緯度坐標)、審批人、審批日期、使用數據目的等信息。
用戶申請獲批准後,與中心簽訂資料使用保密協議。系統管理員授予用戶「數據提取權」,根據批準的申請設置提取數據的范圍,和數據提取權的有效期限。
在有效期限內,用戶可以提取設定范圍內的數據。同時,系統自動在數據提取記錄表中記錄用戶數據提取日誌(記錄提取數據的范圍、數據測量比例尺、數據來源的庫表、數據提取人和提取日期等),以備查系統數據安全。
3. 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;
}
}