您的位置:首页 > 编程语言 > ASP

被广泛使用的MD5.asp中似乎存在缺陷

2004-07-21 08:28 471 查看
大大小小的论坛 很多都是用asp写的(在我知道的范围内用DVBBS的似乎很多),而密码大都用md5加密后保存到数据库
问题就出在这个过程中使用的md5.asp里面
以下摘抄一些别处的问题
主题:.Net中用MD5函数加密“中文”时,与ASP中的MD5不一致问题

作 者: probevb() 2004-07-18 20:32:43

:0

:0





[回复] [打包] [转贴]
请问如何在.Net中用MD5函数,在加密中文字串时,会出现与ASP中的MD5不一致的现
象。
例如:
在.Net中,加密:MD5("aaa")=47bce5c74f589f4867dbd57e9ca9f808
在ASP中,加密:MD5("aaa")=47bce5c74f589f4867dbd57e9ca9f808

结果相同

但如果是这样:

在.Net中,加密: MD5("您好")=F070AA69F8D73650DA15A0F9D0878A41
在ASP中,加密:MD5("您好")=06f491cd5d884a1baa2c65435353df06

我用的加密函数:

System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile("
您好", "MD5")

请指教,原因为何不同?如何使其.Net与原有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一样有缺陷的程序了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: