大大小小的论坛 很多都是用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一样有缺陷的程序了 |