ScriptBaby的专栏

--- 非典型调试器的输出记录

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

大大小小的论坛  很多都是用asp写的(在我知道的范围内用DVBBS的似乎很多),而密码大都用md5加密后保存到数据库

问题就出在这个过程中使用的md5.asp里面

以下摘抄一些别处的问题

主题:.Net中用MD5函数加密“中文”时,与ASP中的MD5不一致问题
用户泡泡状态 作 者: probevb() 2004-07-18 20:32:43 赞成:0 反对:0 用户信息发送短信用户IP
[回复] [打包] [转贴]

请问如何在.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一样有缺陷的程序了

阅读更多
个人分类: ASP/ASP.Net Delphi
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭