Как хэшировать строку UTF-8 в Classic ASP - PullRequest
2 голосов
/ 27 января 2012

Я искал классический ASP-скрипт, который позволил бы мне хэшировать строку, используя алгоритм MD5. Мне нужно сопоставить эту хешированную строку с той же самой строкой на странице ASP.NET, хэшированной с использованием алгоритмов хеширования .NET MD5.

Несмотря на то, что я нашел несколько сценариев для Classic ASP, которые генерируют хэш, я не нашел сценария, который генерирует правильный хэш с использованием неанглийских символов (например, ñ).

Знаете ли вы какой-нибудь классический ASP-скрипт, который работает в данном конкретном случае?

Примечание:

Я пробовал эти сценарии:

http://userpages.umbc.edu/~mabzug1/cs/md5/md5.asp

http://forums.aspfree.com/code-bank-54/asp-classic-md5-hash-82164.html

Примеры:

Строка:

muñeca

Правильный хэш MD5:

ea07bec1f37f4b56ebe368355d1c058f

Генерируемый хэш:

298e60cb1179df15d5772726a3975132

Ответы [ 6 ]

2 голосов
/ 10 сентября 2015

Если вы используете UTF-8 как на .Net, так и на Classic ASP, вы сможете позаимствовать реализацию .Net.

Как то так;

<%
Dim asc, enc, bytes, instr, outstr, pos

instr = "muñeca"

Set asc = CreateObject("System.Text.UTF8Encoding")
Set enc = CreateObject("System.Security.Cryptography.MD5CryptoServiceProvider")

bytes = asc.GetBytes_4(instr)
bytes = enc.ComputeHash_2((bytes))

outstr = ""

'Convert the Byte Array to a Hex string
For pos = 1 To LenB(bytes)
 outstr = outstr & LCase(Right("0" & Hex(AscB(MidB(bytes, pos, 1))), 2))
Next

Response.Write outstr
%>

Выход:

ea07bec1f37f4b56ebe368355d1c058f

Это единственный допустимый метод, который я нашел для Классического ASP, потому что все другие реализации предполагают кодирование ANSI, и в результате вы получаете неправильный хеш.

Благодарность: Репликация PHP sha1 () в VBScript за помощь в окончательном поиске решения.

2 голосов
/ 27 января 2012

Первая часть хеширования любой строки - это получение байтового массива символов строки. Созданный байтовый массив зависит от типа кодировка , используемого для строки. .Net строки кодируются в UTF-16. Я не помню тип кодировки vbscript по типу моей головы, но, вероятно, это просто ascii или, в лучшем случае, UTF-8.

Поэтому, чтобы решить вашу проблему, первое, что вам нужно сделать, это получить vbscript, который даст вам байтовый массив, который представляет символы UTF-16 в вашей строке. Затем найдите хеш-функцию md5, которая напрямую ожидает байтовый массив вместо строкового типа.

К сожалению, даже этого может быть недостаточно. Возможно, отсутствие в Vbscript нативного UTF-16 может привести к тому, что обычно незначительная потеря верности в строке, вводимой пользователем, так что строка в вашем коде Classic ASP больше не равна точно такие же символы , что и строка в вашем коде ASP.Net. В этом случае единственное решение - изменить код ASP.Net, чтобы он соответствовал кодировке Classic ASP, а не наоборот. В любом случае это может быть гораздо более простым решением. Чтобы это работало, вам нужно будет точно знать , какой символ использует ваш код vbscript. Опять же, у меня больше нет этой информации в голове, так что вы можете гуглить ее, как и я.

2 голосов
/ 27 января 2012

Само вычисление хеша не ваша проблема.Вы используете UTF-8 в .net и ANSI / Latin1 в asp classic.

Алгоритм хеширования работает с последовательностью байтов, а не со строкой.Таким образом, сначала вам нужно сначала преобразовать строку в последовательность байтов, процесс, называемый кодированием.Распространенными вариантами являются ANSI (устаревшая кодировка, зависящая от локали в Windows), UTF-8 и UTF-16 LE.

Сначала выберите кодировку и используйте ее последовательно на обеих платформах.Я рекомендую UTF-8, который в .net доступен через Encoding.UTF.GetBytes().Вам нужно будет найти UTF-8 + asp classic, чтобы понять, как его использовать.Поскольку кодировка UTF-8 является распространенной проблемой, я уверен, что вы что-то найдете.

Я подозреваю, что ваш классический код asp использует ANSI, но я настоятельно рекомендую его не использовать, поскольку он поддерживает только небольшое подмножествовозможных символов и зависит от локали.

1 голос
/ 16 февраля 2017

С помощью этой функции вы можете хешировать простой текст в: SHA1, SHA256, SHA384, SHA512, MD5, RIPEMD160 Если вам нужно больше, вы можете найти его в: System.Security.Cryptography Namespace

Function Hash(HashType, PlainText)
    On Error Resume Next

    With CreateObject("ADODB.Stream")
        .Open
        .CharSet = "Windows-1252"
        .WriteText PlainText
        .Position = 0
        .CharSet = "UTF-8"
        PlainText = .ReadText
        .Close
    End With

    Set UTF8Encoding = CreateObject("System.Text.UTF8Encoding")
    Dim PlainTextToBytes, BytesToHashedBytes, HashedBytesToHex

    PlainTextToBytes = UTF8Encoding.GetBytes_4(PlainText)

    Select Case HashType
        Case "sha1": Set Cryptography = CreateObject("System.Security.Cryptography.SHA1Managed")
        Case "sha256": Set Cryptography = CreateObject("System.Security.Cryptography.SHA256Managed")
        Case "sha384": Set Cryptography = CreateObject("System.Security.Cryptography.SHA384Managed")
        Case "sha512": Set Cryptography = CreateObject("System.Security.Cryptography.SHA512Managed")
        Case "md5": Set Cryptography = CreateObject("System.Security.Cryptography.MD5CryptoServiceProvider")
        Case "ripemd160": Set Cryptography = CreateObject("System.Security.Cryptography.RIPEMD160Managed")
    End Select

    Cryptography.Initialize()
    BytesToHashedBytes = Cryptography.ComputeHash_2((PlainTextToBytes))

    For x = 1 To LenB(BytesToHashedBytes)
        HashedBytesToHex = HashedBytesToHex & Right("0" & Hex(AscB(MidB(BytesToHashedBytes, x, 1))), 2)
    Next

    Hash = LCase(HashedBytesToHex)

    If Err.Number <> 0 Then Response.Write(Err.Description)

    On Error GoTo 0
End Function

Они могут использоваться следующим образом:

Hash("sha512", "Hello World")

Производит: 2c74fd17edafd80e8447b0d46741ee243b7eb74dd2149a0ab1b9246fb30382f27e853d8585719e0e67cbda0daa8f51671064615d645ae27acb15bfb1447f459b

1016 1014 *1017* 1014 *1017* 1014 1014a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e Hash("md5", "muñeca") Производит: ea07bec1f37f4b56ebe368355d1c058f
0 голосов
/ 28 января 2012

Вы можете заключить хеш-код .NET MD5 в COM-видимую сборку .Затем вы можете развернуть и использовать один и тот же точный хэш-код MD5 на своих сайтах ASP.NET и классических ASP.

0 голосов
/ 27 января 2012

Если вы хотите именно то, что делает .Net, вы можете декомпилировать метод ComputeHash из HashAlgorithm класса (также рассмотрите MD5CryptoServiceProvider класс) из .Net сборки mscorlib.dll (по пути, указанному на вашем компьютере: C: \ Program Files (x86) \ Reference Assemblies \ Microsoft \ Framework.NETFramework \ v4.0 \ mscorlib.dll), а затем преобразовать коды в ASP-Классик.Вот некоторые хорошие (бесплатные) декомпиляторы:

1- http://www.reflector.net/

2- http://www.telerik.com/products/decompiler.aspx

...