日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

关于SSIS中解密数据库字符串的方法

發(fā)布時(shí)間:2025/7/14 数据库 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于SSIS中解密数据库字符串的方法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

? ? ?此文章適合于SSIS新手,我是個(gè)小白,在繁復(fù)查閱資料后仍無果到最后解決問題,走了很多彎路,現(xiàn)在講其中一些關(guān)于SSIS的理解寫出來,供大家參考,在正文之前,我就我自己的理解,闡明一些概念。

? ?什么是SSIS? 大數(shù)據(jù)中會(huì)涉及到一個(gè)概念, 叫ETL,中文就是數(shù)據(jù)的提取、加載、轉(zhuǎn)換。SSIS是ETL常用工具中的一種,具體的這位仁兄的博客寫的很詳細(xì)http://www.cnblogs.com/qinpengming/archive/2011/12/06/2278299.html。我就不過多贅述了

? ?如果從SSIS包中需要讀取SQL數(shù)據(jù)庫中的連接信息,當(dāng)然前提是這些信息是加密過的。需要一個(gè)媒介,來進(jìn)行解密,再將解密后的連接字符串進(jìn)行賦值,來讓SSIS包正常執(zhí)行封裝測試。其實(shí)思路很明確,但是過程中總是會(huì)遇到一些莫名其妙的問題,尤其是在做升級(jí)的時(shí)候。

關(guān)于封裝密碼明文的解決方案如下:

?

  • 當(dāng)把包在VS2015中打開之後,點(diǎn)擊SSIS菜單欄下的Package?Configuration,查看鏈接管理配置信息。所以如下圖所示
  • ?

    ?

    ?

    ? ? 2.當(dāng)我們選擇用是腳本來解密數(shù)據(jù)庫連接字符串的時(shí)候,就不再需要用配置包的SQL連接來獲取了,所以需要?jiǎng)h除相關(guān)的數(shù)據(jù)庫配置數(shù)據(jù),組態(tài)只保留除連接數(shù)據(jù)庫配置以外的連接信息。因?yàn)榻M態(tài)讀取某個(gè)數(shù)據(jù)庫的配置信息,我們會(huì)把數(shù)據(jù)庫里面的數(shù)據(jù)庫連接加密,下面Connection Managers是識(shí)別不了加密的數(shù)據(jù)庫連接,這樣在VS2015上是可以正常跑,但是數(shù)據(jù)庫調(diào)用會(huì)報(bào)錯(cuò)。所以我們要把組態(tài)里面的數(shù)據(jù)庫連接刪除。用腳本去數(shù)據(jù)庫里面取讀取數(shù)據(jù)庫連接,并解密,把解密出來的數(shù)據(jù)庫連接賦值給Connection Managers。

    ? ? 3.添加一個(gè)腳本放在每個(gè)Package最前面,然后腳本中先寫一個(gè)用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()){//此處獲取對(duì)應(yīng)的整個(gè)sql身份驗(yàn)證的連接字符串string bb = sdr[1].ToString();string[] connecstr = bb.Split();for (int i = 0; i < connecstr.Length; i++){//判斷是否匹配到數(shù)組中的的密碼if (connecstr[i].Contains("Password")){//獲取帶密碼的字符串長度,比如:Password=Xeferfa0=長度為18int GrossPwdlth = connecstr[i].Length;//獲取Password=后面的加密字符string RevertoldPwd = connecstr[i].Substring(9, GrossPwdlth - 9);//將獲取到的密碼密文進(jìn)行解密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對(duì)象,將解密后的連接字符串賦值給配置數(shù)據(jù)源的名字?Dts.Connections[item].ConnectionString = Reaconn; , 當(dāng)然中間采用什么加密方式,什么解密方式,各位都是大神,初級(jí)的也不是很難,我用的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.到目前為止,所有的代碼工作已經(jīng)完成,剩下的就是配置問題,當(dāng)我在VS2015環(huán)境中跑包全部通過之后,就只剩下SQL2012上進(jìn)行封裝跑包,在此期間,需要鼠標(biāo)點(diǎn)擊整個(gè)項(xiàng)目右鍵選中屬性,此時(shí)在右側(cè)屬性欄位中,在ProtectionLevel?下選擇EncryptSensitiveWithUserKey模式,之前沒選擇該模式,VS中關(guān)閉再打開包,連接數(shù)據(jù)源那里就會(huì)報(bào)紅,VS和sql跑包都會(huì)失敗,sql中提示未正確連接數(shù)據(jù)庫,這里足足卡殼了兩天,終于找到是這里保護(hù)級(jí)別的原因,具體內(nèi)容見下表

    ?

    不保存敏感數(shù)據(jù) (DontSaveSensitive)

    保存包時(shí)不保存包中敏感屬性的值。?這種保護(hù)級(jí)別不進(jìn)行加密,但它防止標(biāo)記為敏感的屬性隨包一起保存,因此其他用戶將無法使用這些敏感數(shù)據(jù)。?如果其他用戶打開該包,敏感信息將被替換為空白,用戶必須提供這些敏感信息。

    當(dāng)與?dtutil?實(shí)用工具 (dtutil.exe) 一起使用時(shí),此保護(hù)級(jí)別對(duì)應(yīng)的值為 0。

    使用密碼加密所有數(shù)據(jù) (EncryptAllWithPassword)

    使用密碼加密整個(gè)包。?使用用戶在創(chuàng)建包或?qū)С霭鼤r(shí)提供的密碼加密包。?若要在 SSIS 設(shè)計(jì)器中打開包或使用?dtexec?命令提示實(shí)用工具運(yùn)行包,用戶必須提供包密碼。?如果沒有密碼,用戶將無法訪問或運(yùn)行包。

    當(dāng)與?dtutil?實(shí)用工具一起使用時(shí),此保護(hù)級(jí)別對(duì)應(yīng)的值為 3。

    使用用戶密鑰加密所有數(shù)據(jù) (EncryptAllWithUserKey)

    使用基于當(dāng)前用戶配置文件的密鑰加密整個(gè)包。?只有創(chuàng)建包或?qū)С霭挠脩舨趴梢栽?SSIS 設(shè)計(jì)器中打開包或使用?dtexec?命令提示實(shí)用工具運(yùn)行包。

    當(dāng)與?dtutil?實(shí)用工具一起使用時(shí),此保護(hù)級(jí)別對(duì)應(yīng)的值為 4。

    注意

    對(duì)于使用用戶密鑰的保護(hù)級(jí)別,Integration Services 使用 DPAPI 標(biāo)準(zhǔn)。?有關(guān) DPAPI 的詳細(xì)信息,請(qǐng)參閱位于?http://msdn.microsoft.com/library?的 MSDN Library。

    使用密碼加密敏感數(shù)據(jù) (EncryptSensitiveWithPassword)

    使用密碼只加密包中敏感屬性的值。?DPAPI 用于此加密。?敏感數(shù)據(jù)作為包的一部分保存,但數(shù)據(jù)是使用當(dāng)前用戶在創(chuàng)建包或?qū)С霭鼤r(shí)提供的密碼加密的。?若要在 SSIS 設(shè)計(jì)器中打開包,用戶必須提供包密碼。?如果不提供該密碼,則包雖然可以打開但其中不包含敏感數(shù)據(jù),當(dāng)前用戶必須為敏感數(shù)據(jù)提供新值。?如果用戶試圖在不提供密碼的情況下執(zhí)行包,則包執(zhí)行將會(huì)失敗。?有關(guān)密碼和命令行執(zhí)行的詳細(xì)信息,請(qǐng)參閱dtexec 實(shí)用工具。

    當(dāng)與?dtutil?實(shí)用工具一起使用時(shí),此保護(hù)級(jí)別對(duì)應(yīng)的值為 2。

    使用用戶密鑰加密敏感數(shù)據(jù) (EncryptSensitiveWithUserKey)

    使用基于當(dāng)前用戶配置文件的密鑰只加密包中敏感屬性的值。?只有使用同一配置文件的同一個(gè)用戶才能加載此包。?如果其他用戶打開該包,敏感信息將被替換為空白,當(dāng)前用戶必須為敏感數(shù)據(jù)提供新值。?如果用戶試圖執(zhí)行該包,則包執(zhí)行將會(huì)失敗。?DPAPI 用于此加密。

    當(dāng)與?dtutil?實(shí)用工具一起使用時(shí),此保護(hù)級(jí)別對(duì)應(yīng)的值為 1。

    注意

    對(duì)于使用用戶密鑰的保護(hù)級(jí)別,Integration Services 使用 DPAPI 標(biāo)準(zhǔn)。?有關(guān) DPAPI 的詳細(xì)信息,請(qǐng)參閱位于?http://msdn.microsoft.com/library?的 MSDN Library。

    依靠服務(wù)器存儲(chǔ)進(jìn)行加密 (ServerStorage)

    使用 SQL Server 數(shù)據(jù)庫角色保護(hù)整個(gè)包。?在將包保存到 SQL Server?msdb 數(shù)據(jù)庫后,支持此選項(xiàng)。?此外,SSISDB 目錄使用?ServerStorage?保護(hù)級(jí)別。

    在將包從 SQL Server Data Tools (SSDT) 保存到文件系統(tǒng)時(shí),不支持此選項(xiàng)。

    ?

    5.設(shè)置完后,請(qǐng)把packag關(guān)閉,在開啟。看Connection?Managers里面的數(shù)據(jù)庫連接有沒有報(bào)紅,如果沒有,就說明設(shè)置好了。

    6.所有的準(zhǔn)備工作都已完成,將包附加到SQL2012?中進(jìn)行封裝測試,如下圖,包?執(zhí)行封裝測試成功

    ?

    ?

    ?作為資深小白,記錄第一篇隨筆,留下個(gè)腳印

    ?

    -------市人皆大笑,舉手揶揄之

    ?

    ?

    轉(zhuǎn)載于:https://www.cnblogs.com/Sientuo/p/5893659.html

    總結(jié)

    以上是生活随笔為你收集整理的关于SSIS中解密数据库字符串的方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。