今天跟大家唠唠我最近折腾的 ASP 加密,这玩意儿现在用的人不多,但有些老项目,你还得硬着头皮上。
事情是这样的,前几天接个活儿,甲方那边的网站是用 ASP 写的,代码都明文放在那儿,也没做啥保护。甲方就提个要求,说得把代码加密一下,省得被人直接扒走。
一听这要求,我就开始琢磨,ASP 加密这玩意儿,说难不难,说简单也不简单。网上搜一圈,大概有这么几种方案:
用微软的 Script Encoder(*)
搞组件加密
自己写程序加密
Script Encoder 这玩意儿,我第一个就pass,加密效果一般,而且还得用老版本的 IE 才能正常浏览,太不靠谱。
组件加密,听起来挺高大上的,但是要写 DLL,还得注册啥的,想想就麻烦,时间也不允许。
我决定还是自己写程序加密,虽然麻烦点,但是可控性强。
说干就干,我先是想个简单的加密算法,就是把 ASP 代码里的字符,按照一定的规则替换一下,比如 A 换成 B,B 换成 C 啥的。
asp
Function Encrypt(str)
Dim i, char, encryptedStr
encryptedStr = ""
For i = 1 To Len(str)
char = Mid(str, i, 1)
'// 这里可以写你的加密逻辑,比如简单的字符替换
char = Chr(Asc(char) + 1) ' 简单地把每个字符的 ASCII 码加 1
encryptedStr = encryptedStr & char
Next
Encrypt = encryptedStr
End Function
加密是简单,但是解密也简单,别人一看就知道你这啥玩意儿。
于是我又加点料,搞个稍微复杂点的算法,就是把 ASP 代码里的字符,先用 MD5 散列一下,然后再用 Base64 编码一下。
asp
Function MD5(str)
Dim objMD5, arrByte, i
Set objMD5 = CreateObject("*.MD5CryptoServiceProvider")
arrByte = *_2(StrToByte(str))
MD5 = ""
For i = 0 To UBound(arrByte)
MD5 = MD5 & Right("0" & Hex(arrByte(i)), 2)
Next
Set objMD5 = Nothing
End Function
Function StrToByte(str)
Dim arrByte(), i
ReDim arrByte(Len(str) - 1)
For i = 1 To Len(str)
arrByte(i - 1) = AscB(Mid(str, i, 1))
Next
StrToByte = arrByte
End Function
Function Base64Encode(str)
Dim objXML, objNode
Set objXML = CreateObject("*")
Set objNode = *("b64")
* = "*64"
* = StrToByte(str)
Base64Encode = *
Set objNode = Nothing
Set objXML = Nothing
End Function
Function Encrypt(str)
Encrypt = Base64Encode(MD5(str))
End Function
这样一来,加密后的代码就变得乱七八糟的,就算别人扒走,也看不懂是啥玩意儿。
解密也得有相应的代码:
asp
Function Base64Decode(str)
Dim objXML, objNode
Set objXML = CreateObject("*")
Set objNode = *("b64")
* = "*64"
* = str
Base64Decode = ByteToStr(*)
Set objNode = Nothing
Set objXML = Nothing
End Function
Function ByteToStr(arrByte)
Dim i
ByteToStr = ""
For i = 0 To UBound(arrByte)
ByteToStr = ByteToStr & Chr(arrByte(i))
Next
ByteToStr = ByteToStr
End Function
Function Decrypt(str)
Decrypt = Base64Decode(str)
End Function
加密解密的代码都有,接下来就是把 ASP 代码里的敏感部分,用加密函数加密一下,然后在页面上用解密函数解密一下。
例如,你想加密数据库连接字符串:
asp
' 加密前的连接字符串
'connStr = "Provider=*.4.0;Data Source=*"
' 加密后的连接字符串
encryptedConnStr = Encrypt("Provider=*.4.0;Data Source=*")
' 使用时解密
connStr = Decrypt(encryptedConnStr)
Set conn = *("*")
* connStr
这样,就算别人看到加密后的字符串,也不知道原来的连接字符串是什么。
我把所有的 ASP 文件都加密一遍,然后交给甲方。甲方那边测试一下,没啥问题,就验收。
这回 ASP 加密的实践,让我又复习一遍 ASP 的知识,也学到一些简单的加密技巧。虽然 ASP 现在用的人不多,但是掌握一些基本的加密方法,还是很有用的。
注意: 这只是个简单的加密例子,实际应用中,还需要根据具体情况,选择更复杂的加密算法,才能保证代码的安全性。 别指望靠这玩意儿就能防住所有黑客,只能说聊胜于无。