大大小小的论坛 很多都是用asp写的(在我知道的范围内用DVBBS的似乎很多),而密码大都用md5加密后保存到数据库
问题就出在这个过程中使用的md5.asp里面
以下摘抄一些别处的问题
主题:.Net中用MD5函数加密“中文”时,与ASP中的MD5不一致问题 | ||||||||
|
不止.Net的MD5加密和md5.asp有出入,我用Delphi7的IndyMD5以及从各处搜索来的md5代码算出的都和.Net的md5加密结果一样,跟md5.asp不同...初步判断是md5.asp本身的缺陷
但是这个md5.asp都被使用了很长时间,数据库中留的也都是这样“错误”的加密结果,所以改md5.asp似乎不能很好地解决问题了...
只能祈祷/警告用户不要使用中文密码?
也许应该修改一下我们的原本正确的程序
猜测:既然只在处理中文的时候出问题,应该是和vbs的字符处理有关...
我在md5.asp里面找到了这样内容:
Private Function ConvertToWordArray(sMessage)
Dim lMessageLength
Dim lNumberOfWords
Dim lWordArray()
Dim lBytePosition
Dim lByteCount
Dim lWordCount
Const MODULUS_BITS = 512
Const CONGRUENT_BITS = 448
lMessageLength = Len(sMessage)
lNumberOfWords = (((lMessageLength + ((MODULUS_BITS - CONGRUENT_BITS) / BITS_TO_A_BYTE)) / (MODULUS_BITS / BITS_TO_A_BYTE)) + 1) * (MODULUS_BITS / BITS_TO_A_WORD)
ReDim lWordArray(lNumberOfWords - 1)
lBytePosition = 0
lByteCount = 0
Do Until lByteCount >= lMessageLength
lWordCount = lByteCount / BYTES_TO_A_WORD
lBytePosition = (lByteCount Mod BYTES_TO_A_WORD) * BITS_TO_A_BYTE
lWordArray(lWordCount) = lWordArray(lWordCount) Or LShift(Asc(Mid(sMessage, lByteCount + 1, 1)), lBytePosition)
lByteCount = lByteCount + 1
Loop
lWordCount = lByteCount / BYTES_TO_A_WORD
lBytePosition = (lByteCount Mod BYTES_TO_A_WORD) * BITS_TO_A_BYTE
lWordArray(lWordCount) = lWordArray(lWordCount) Or LShift(&H80, lBytePosition)
lWordArray(lNumberOfWords - 2) = LShift(lMessageLength, 3)
lWordArray(lNumberOfWords - 1) = RShift(lMessageLength, 29)
ConvertToWordArray = lWordArray
End Function
显然,上面黄色的部分使用了Mid函数,
VBS中处理字符串的时候是变成Unicode后进行处理,这样无论英文 还是中文 一个字符都被看作两字节...而Mid则可以保证取得的是完整的字符
但是我们用的.Net或者Delphi程序中,md5加密似乎是把文本内容看作流(也许应该说它们在处理的实际上就是流),以字节为单位...
于是 我们算出的结果就和md5.asp有出入了......
我想如果和原有的数据保持兼容的话,我们只能再写一个和md5.asp一样有缺陷的程序了