被广泛使用的MD5.asp中似乎存在缺陷
2004-07-21 08:28
471 查看
大大小小的论坛 很多都是用asp写的(在我知道的范围内用DVBBS的似乎很多),而密码大都用md5加密后保存到数据库
问题就出在这个过程中使用的md5.asp里面
以下摘抄一些别处的问题
不止.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一样有缺陷的程序了
问题就出在这个过程中使用的md5.asp里面
以下摘抄一些别处的问题
主题:.Net中用MD5函数加密“中文”时,与ASP中的MD5不一致问题 | ||||||
|
但是这个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.NET WEB FORM 子父窗体之间参数的传递
- asp常用函数(三)
- asp常用函数(一)
- ASP提速技巧五则
- ASP初学者的10个编程技巧
- Asp.net中基于Forms验证的角色验证授权
- 我和asp的故事(1)
- 在域环境下配置Asp.Net
- info
- 在ASP 中实现ASP.Net 的DataGrid 功能(转载)
- 怎么用ASPX页面生成缩略图
- 对于长时间装载的ASP.NET页面如何在客户端浏览器中显示进度?
- ASP.NET页面是怎样生成的
- 自定义asp.net控件分析 (一)
- ASP中一个字符串处理类(加强)(VBScript)
- 在ASP中用组件检测当前网卡地址
- ASP.NET中提示客户端下载文件
- 如何用asp的jmail发邮件?
- 使用ASP+jmail进行邮件群发
- 利用CDONTS发送邮件的ASP函数