?????????一般情況下,Asp.Net程序中,數(shù)據(jù)庫(kù)連接字符串大多存儲(chǔ)在配置文件中。如果程序不是手工發(fā)布,而是通過(guò)安裝程序部署,那么通常在安裝過(guò)程中需要用戶輸入數(shù)據(jù)庫(kù)管理員帳號(hào)和密碼,以便安裝數(shù)據(jù)庫(kù)。同時(shí)將管理員帳號(hào)和密碼以及數(shù)據(jù)庫(kù)服務(wù)器地址(或者數(shù)據(jù)庫(kù)連接字符串)寫(xiě)入配置文件中。但是如果不加密,尤其是數(shù)據(jù)庫(kù)管理員密碼,若以明碼形式存儲(chǔ),極容易被竊取。
???????? 這就需要對(duì)字符串進(jìn)行加密處理。但是在安裝制作軟件(我用的是InstallShield 12)中沒(méi)有提供專用的加密方法,而且在InstallShield中加密過(guò)的字符串在Asp.Net(我用的是C#編寫(xiě)Asp.Net)中要能夠被解密,則必須用兩者通用的加密解密方法。因此我想到,每個(gè)字符的ASCII碼都是通用的,只要在InstallShield中對(duì)字符的ASCII碼進(jìn)行處理,比如加一或移位,得到一個(gè)新的字符串,再到C#?中進(jìn)行逆向操作,就可以還原為原來(lái)的字符串。
????????在尋思用什么方法加密的時(shí)候,偶然想到曾經(jīng)在一外網(wǎng)站上下載的一段代碼,趕緊找將出來(lái)(后來(lái)還幸運(yùn)地回憶起那個(gè)網(wǎng)站,那就是非常有名的 InstallSite ,大家可以上去逛逛,那里有很多InstallShield的腳本示例代碼,可以下載參考參考) ,他的源碼如下:
/**/
//////////////////////////////////////////////////////////////////////////////
/
//
//
//
?Function:?String2Password
//
//
//
//
??Purpose:?This?function?takes?a?string?and?returns?a?numeric?equivalent???
//
//
???????????of?all?the?character's?ASCII?values?added?together.
//
//
???????????(Note:?InstallShield?may?use?different?values?than?the?ASCII????
//
//
???????????table
I?did?not?verify?this.)
//
//
//
/**/
//////////////////////////////////////////////////////////////////////////////
/
function?String2Password(?nAnswer,?szName?)
???? STRING?szRight,?szLeft;
???? CHAR???cChar;
???? NUMBER?nLength;
?begin
?????? nAnswer?
=
?
0
;
?????? nLength?
=
?StrLength(szName);
???
??? while
?(nLength?
>
?
0
)
????????StrSub(szRight,?szName,?
1
,?(nLength
-
1
));
????????StrSub(szLeft,?szName,?
0
,?
1
);
????????cChar?
=
?szLeft[
0
];
????????
if
?(cChar?
<
?
0
)?then
???????????? cChar?
=
?cChar?
&
?
255
;
????????endif;
????????szName?
=
?szRight;
????????nAnswer?
=
?nAnswer?
+
?cChar;
????????nLength?
=
?nLength?
-
?
1
;
???endwhile;
?end;
????????這段代碼返回的是一個(gè)求和的數(shù)字,并不完全符合我們的要求,而且我發(fā)現(xiàn)cChar=szLeft[0]的取值是有問(wèn)題的.大家注意到?jīng)]有,代碼作者也在注釋中有說(shuō)明.也不知道 InstallSite 為什么把這種有問(wèn)題的代碼作放在網(wǎng)站上,還居然作為Sample供下載.
??????? 于是將其改造了一番:
???????
??????? 至于C#的解碼就很簡(jiǎn)單了,這里也一并貼出來(lái),湊個(gè)數(shù)吧:
??????? 小結(jié):這里為了說(shuō)明問(wèn)題只是用了加1減1的方法,非常簡(jiǎn)單.我正在研究基于XXTea的加密方法,等有了結(jié)果在公布出來(lái).
???????? 這就需要對(duì)字符串進(jìn)行加密處理。但是在安裝制作軟件(我用的是InstallShield 12)中沒(méi)有提供專用的加密方法,而且在InstallShield中加密過(guò)的字符串在Asp.Net(我用的是C#編寫(xiě)Asp.Net)中要能夠被解密,則必須用兩者通用的加密解密方法。因此我想到,每個(gè)字符的ASCII碼都是通用的,只要在InstallShield中對(duì)字符的ASCII碼進(jìn)行處理,比如加一或移位,得到一個(gè)新的字符串,再到C#?中進(jìn)行逆向操作,就可以還原為原來(lái)的字符串。
????????在尋思用什么方法加密的時(shí)候,偶然想到曾經(jīng)在一外網(wǎng)站上下載的一段代碼,趕緊找將出來(lái)(后來(lái)還幸運(yùn)地回憶起那個(gè)網(wǎng)站,那就是非常有名的 InstallSite ,大家可以上去逛逛,那里有很多InstallShield的腳本示例代碼,可以下載參考參考) ,他的源碼如下:
/**/
//////////////////////////////////////////////////////////////////////////////
/
//
//
//
?Function:?String2Password
//
//
//
//
??Purpose:?This?function?takes?a?string?and?returns?a?numeric?equivalent???
//
//
???????????of?all?the?character's?ASCII?values?added?together.
//
//
???????????(Note:?InstallShield?may?use?different?values?than?the?ASCII????
//
//
???????????table
I?did?not?verify?this.)
//
//
//
/**/
//////////////////////////////////////////////////////////////////////////////
/
function?String2Password(?nAnswer,?szName?)
???? STRING?szRight,?szLeft;
???? CHAR???cChar;
???? NUMBER?nLength;
?begin
?????? nAnswer?
=
?
0
;
?????? nLength?
=
?StrLength(szName);
???
??? while
?(nLength?
>
?
0
)
????????StrSub(szRight,?szName,?
1
,?(nLength
-
1
));
????????StrSub(szLeft,?szName,?
0
,?
1
);
????????cChar?
=
?szLeft[
0
];
????????
if
?(cChar?
<
?
0
)?then
???????????? cChar?
=
?cChar?
&
?
255
;
????????endif;
????????szName?
=
?szRight;
????????nAnswer?
=
?nAnswer?
+
?cChar;
????????nLength?
=
?nLength?
-
?
1
;
???endwhile;
?end;
????????這段代碼返回的是一個(gè)求和的數(shù)字,并不完全符合我們的要求,而且我發(fā)現(xiàn)cChar=szLeft[0]的取值是有問(wèn)題的.大家注意到?jīng)]有,代碼作者也在注釋中有說(shuō)明.也不知道 InstallSite 為什么把這種有問(wèn)題的代碼作放在網(wǎng)站上,還居然作為Sample供下載.
??????? 于是將其改造了一番:
???????
?/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//???
//??????????????????? string2password.rul
//?
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1
function
?
STRING
?String2Password(szName?)
?2
?
STRING
?szRight
,
?szLeft
,
szAnswer;
?3
?CHAR???cChar;
?4
?
NUMBER
?nLength;
?5
?6
?begin
?7
?8
???szAnswer?
=
?
""
;
?9
???nLength?
=
?StrLength(szName);
10
???
while
?(nLength?
>
?
0
)
11
??????StrSub(szRight
,
?szName
,
?
1
,
?(nLength
-
1
));
12
??????StrSub(szLeft
,
?szName
,
?
0
,
?
1
);
13
??????cChar?
=
?STRTOCHAR(szLeft);
14
??????cChar?
=
?cChar?
+
1
;
15
??????szName?
=
?szRight;
16
??????CharReplace(szLeft
,
STRTOCHAR(szLeft)
,
cChar
,
0
)
17
??????szAnswer?
=
?szAnswer?
+
?szLeft;
18
??????nLength?
=
?nLength?
-
?
1
;
19
???
endwhile
;
20
???
return
?szAnswer;
21
?
end
;
//???
//??????????????????? string2password.rul
//?
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1
function
?
STRING
?String2Password(szName?)
?2
?
STRING
?szRight
,
?szLeft
,
szAnswer;
?3
?CHAR???cChar;
?4
?
NUMBER
?nLength;
?5
?6
?begin
?7
?8
???szAnswer?
=
?
""
;
?9
???nLength?
=
?StrLength(szName);
10
???
while
?(nLength?
>
?
0
)
11
??????StrSub(szRight
,
?szName
,
?
1
,
?(nLength
-
1
));
12
??????StrSub(szLeft
,
?szName
,
?
0
,
?
1
);
13
??????cChar?
=
?STRTOCHAR(szLeft);
14
??????cChar?
=
?cChar?
+
1
;
15
??????szName?
=
?szRight;
16
??????CharReplace(szLeft
,
STRTOCHAR(szLeft)
,
cChar
,
0
)
17
??????szAnswer?
=
?szAnswer?
+
?szLeft;
18
??????nLength?
=
?nLength?
-
?
1
;
19
???
endwhile
;
20
???
return
?szAnswer;
21
?
end
;
??????? 至于C#的解碼就很簡(jiǎn)單了,這里也一并貼出來(lái),湊個(gè)數(shù)吧:
?1
?
public
?
string
?password2string(
string
?sPass)
?2
????
{
?3
????????
string
?sResult?
=
?
string
.Empty;
?4
????????
for
?(
int
?i?
=
?
0
;?i?
<
?sPass.Length;?i
++
)
?5
????????
{
?6
????????????
int
?num?
=
?(
int
)
char
.Parse(sPass.Substring(i,
1
))?
-
?
1
;
?7
????????????sResult
+=
((
char
)num).ToString();
?8
????????}
?9
????????
return
?sResult;
10
????}
?
public
?
string
?password2string(
string
?sPass)
?2
????
{
?3
????????
string
?sResult?
=
?
string
.Empty;
?4
????????
for
?(
int
?i?
=
?
0
;?i?
<
?sPass.Length;?i
++
)
?5
????????
{
?6
????????????
int
?num?
=
?(
int
)
char
.Parse(sPass.Substring(i,
1
))?
-
?
1
;
?7
????????????sResult
+=
((
char
)num).ToString();
?8
????????}
?9
????????
return
?sResult;
10
????}
??????? 小結(jié):這里為了說(shuō)明問(wèn)題只是用了加1減1的方法,非常簡(jiǎn)單.我正在研究基于XXTea的加密方法,等有了結(jié)果在公布出來(lái).
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

