关于SSIS中解密数据库字符串的方法
? ? ?此文章適合于SSIS新手,我是個小白,在繁復查閱資料后仍無果到最后解決問題,走了很多彎路,現在講其中一些關于SSIS的理解寫出來,供大家參考,在正文之前,我就我自己的理解,闡明一些概念。
? ?什么是SSIS? 大數據中會涉及到一個概念, 叫ETL,中文就是數據的提取、加載、轉換。SSIS是ETL常用工具中的一種,具體的這位仁兄的博客寫的很詳細http://www.cnblogs.com/qinpengming/archive/2011/12/06/2278299.html。我就不過多贅述了
? ?如果從SSIS包中需要讀取SQL數據庫中的連接信息,當然前提是這些信息是加密過的。需要一個媒介,來進行解密,再將解密后的連接字符串進行賦值,來讓SSIS包正常執行封裝測試。其實思路很明確,但是過程中總是會遇到一些莫名其妙的問題,尤其是在做升級的時候。
關于封裝密碼明文的解決方案如下:
?
?
?
?
? ? 2.當我們選擇用是腳本來解密數據庫連接字符串的時候,就不再需要用配置包的SQL連接來獲取了,所以需要刪除相關的數據庫配置數據,組態只保留除連接數據庫配置以外的連接信息。因為組態讀取某個數據庫的配置信息,我們會把數據庫里面的數據庫連接加密,下面Connection Managers是識別不了加密的數據庫連接,這樣在VS2015上是可以正常跑,但是數據庫調用會報錯。所以我們要把組態里面的數據庫連接刪除。用腳本去數據庫里面取讀取數據庫連接,并解密,把解密出來的數據庫連接賦值給Connection Managers。
? ? 3.添加一個腳本放在每個Package最前面,然后腳本中先寫一個用windows身份連接的
? ? ? ?
public static string GetConDb(string filter, string Dbname){string Reaconn = "";string constr = "Data Source=.;Initial Catalog=IBBC;Integrated Security=SSPI;";string sqlstr = "SELECT * FROM IBBC.dbo.Table_1 where temp1='"+filter+"' and temp2='"+Dbname+"'";SqlConnection con = new SqlConnection(constr);SqlCommand cmd = new SqlCommand(sqlstr, con);con.Open();try{SqlDataReader sdr = cmd.ExecuteReader();while (sdr.Read()){//此處獲取對應的整個sql身份驗證的連接字符串string bb = sdr[1].ToString();string[] connecstr = bb.Split();for (int i = 0; i < connecstr.Length; i++){//判斷是否匹配到數組中的的密碼if (connecstr[i].Contains("Password")){//獲取帶密碼的字符串長度,比如:Password=Xeferfa0=長度為18int GrossPwdlth = connecstr[i].Length;//獲取Password=后面的加密字符string RevertoldPwd = connecstr[i].Substring(9, GrossPwdlth - 9);//將獲取到的密碼密文進行解密string newpwd = DecryptDES(RevertoldPwd, UUkey);//將密文密碼替換成明文密碼bb = bb.Replace(RevertoldPwd, newpwd);}}Reaconn = bb;}return Reaconn;}catch (Exception ex){throw new Exception(ex.Message); ;}finally {con.Close(); } }?
然后再用腳本組件中自帶的DTs對象,將解密后的連接字符串賦值給配置數據源的名字?Dts.Connections[item].ConnectionString = Reaconn; , 當然中間采用什么加密方式,什么解密方式,各位都是大神,初級的也不是很難,我用的Des加密,如下。
private static byte[] Keys = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };//密鑰private static string UUkey = "********";/**//**//**//// <summary>/// DES加密字符串/// </summary>/// <param name="encryptString">待加密的字符串</param>/// <param name="encryptKey">加密密鑰,要求為8位</param>/// <returns>加密成功返回加密后的字符串,失敗返回源串</returns>public static string EncryptDES(string encryptString, string encryptKey){try{byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 8));byte[] rgbIV = Keys;byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider();MemoryStream mStream = new MemoryStream();CryptoStream cStream = new CryptoStream(mStream, dCSP.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write);cStream.Write(inputByteArray, 0, inputByteArray.Length);cStream.FlushFinalBlock();return Convert.ToBase64String(mStream.ToArray());}catch{return encryptString;}}/**//**//**//// <summary>/// DES解密字符串/// </summary>/// <param name="decryptString">待解密的字符串</param>/// <param name="decryptKey">解密密鑰,要求為8位,和加密密鑰相同</param>/// <returns>解密成功返回解密后的字符串,失敗返源串</returns>public static string DecryptDES(string decryptString, string decryptKey){try{byte[] rgbKey = Encoding.UTF8.GetBytes(decryptKey);byte[] rgbIV = Keys;byte[] inputByteArray = Convert.FromBase64String(decryptString);DESCryptoServiceProvider DCSP = new DESCryptoServiceProvider();MemoryStream mStream = new MemoryStream();CryptoStream cStream = new CryptoStream(mStream, DCSP.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write);cStream.Write(inputByteArray, 0, inputByteArray.Length);cStream.FlushFinalBlock();return Encoding.UTF8.GetString(mStream.ToArray());}catch{return decryptString;}}?
4.到目前為止,所有的代碼工作已經完成,剩下的就是配置問題,當我在VS2015環境中跑包全部通過之后,就只剩下SQL2012上進行封裝跑包,在此期間,需要鼠標點擊整個項目右鍵選中屬性,此時在右側屬性欄位中,在ProtectionLevel?下選擇EncryptSensitiveWithUserKey模式,之前沒選擇該模式,VS中關閉再打開包,連接數據源那里就會報紅,VS和sql跑包都會失敗,sql中提示未正確連接數據庫,這里足足卡殼了兩天,終于找到是這里保護級別的原因,具體內容見下表
?
| 不保存敏感數據 (DontSaveSensitive) | 保存包時不保存包中敏感屬性的值。?這種保護級別不進行加密,但它防止標記為敏感的屬性隨包一起保存,因此其他用戶將無法使用這些敏感數據。?如果其他用戶打開該包,敏感信息將被替換為空白,用戶必須提供這些敏感信息。 當與?dtutil?實用工具 (dtutil.exe) 一起使用時,此保護級別對應的值為 0。 | |
| 使用密碼加密所有數據 (EncryptAllWithPassword) | 使用密碼加密整個包。?使用用戶在創建包或導出包時提供的密碼加密包。?若要在 SSIS 設計器中打開包或使用?dtexec?命令提示實用工具運行包,用戶必須提供包密碼。?如果沒有密碼,用戶將無法訪問或運行包。 當與?dtutil?實用工具一起使用時,此保護級別對應的值為 3。 | |
| 使用用戶密鑰加密所有數據 (EncryptAllWithUserKey) | 使用基于當前用戶配置文件的密鑰加密整個包。?只有創建包或導出包的用戶才可以在 SSIS 設計器中打開包或使用?dtexec?命令提示實用工具運行包。 當與?dtutil?實用工具一起使用時,此保護級別對應的值為 4。
| |
| 使用密碼加密敏感數據 (EncryptSensitiveWithPassword) | 使用密碼只加密包中敏感屬性的值。?DPAPI 用于此加密。?敏感數據作為包的一部分保存,但數據是使用當前用戶在創建包或導出包時提供的密碼加密的。?若要在 SSIS 設計器中打開包,用戶必須提供包密碼。?如果不提供該密碼,則包雖然可以打開但其中不包含敏感數據,當前用戶必須為敏感數據提供新值。?如果用戶試圖在不提供密碼的情況下執行包,則包執行將會失敗。?有關密碼和命令行執行的詳細信息,請參閱dtexec 實用工具。 當與?dtutil?實用工具一起使用時,此保護級別對應的值為 2。 | |
| 使用用戶密鑰加密敏感數據 (EncryptSensitiveWithUserKey) | 使用基于當前用戶配置文件的密鑰只加密包中敏感屬性的值。?只有使用同一配置文件的同一個用戶才能加載此包。?如果其他用戶打開該包,敏感信息將被替換為空白,當前用戶必須為敏感數據提供新值。?如果用戶試圖執行該包,則包執行將會失敗。?DPAPI 用于此加密。 當與?dtutil?實用工具一起使用時,此保護級別對應的值為 1。
| |
| 依靠服務器存儲進行加密 (ServerStorage) | 使用 SQL Server 數據庫角色保護整個包。?在將包保存到 SQL Server?msdb 數據庫后,支持此選項。?此外,SSISDB 目錄使用?ServerStorage?保護級別。 在將包從 SQL Server Data Tools (SSDT) 保存到文件系統時,不支持此選項。 |
?
5.設置完后,請把packag關閉,在開啟。看Connection?Managers里面的數據庫連接有沒有報紅,如果沒有,就說明設置好了。
6.所有的準備工作都已完成,將包附加到SQL2012?中進行封裝測試,如下圖,包?執行封裝測試成功
?
?
?作為資深小白,記錄第一篇隨筆,留下個腳印
?
-------市人皆大笑,舉手揶揄之
?
?
轉載于:https://www.cnblogs.com/Sientuo/p/5893659.html
總結
以上是生活随笔為你收集整理的关于SSIS中解密数据库字符串的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux-``反引号
- 下一篇: 互联网开发(一) 并发基础知识