2012-04-17 4 views
9

Мне нужно создать MD5 в моем приложении.Как сгенерировать MD5 с помощью VBScript в классическом ASP?

Я пробовал Google, но нашел только PHP-код для MD5. Мне нужно подключиться к клиентской системе, которая проверяет использование хеша MD5, но их код находится в PHP, мой - в классическом ASP с использованием VBScript.

Мой сервер поддерживает .Net, поэтому я не могу использовать PHP-скрипт. Есть ли такой код MD5 для VBScript в классическом ASP?

+0

также: FYI, но Windows, IIS будет выполнять код PHP просто отлично. Просто создайте другой пул приложений с обработчиком модуля FastCGI. –

+0

Возможный дубликат [md5/hash on vb6?] (Http://stackoverflow.com/questions/6579523/md5-hash-on-vb6) –

+0

Нет, не vb 6, а скрипт vb на страницах asp? – user1270384

ответ

3

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

http://www.bullzip.com/md5/vb/md5-vb-class.htm

Вот интересная статья Джефф Этвуд на хэшей. У него есть некоторые важные вещи, чтобы сказать о MD5:

http://www.codinghorror.com/blog/2012/04/speed-hashing.html

+0

Спасибо за чтение @camainc, но на самом деле у меня нет большого выбора, система, с которой я подключаюсь, сильно использует ключи хеша MD5 для аутентификации, и это те требования, которые они задали для подключения к ним. Я попробую код быка и советую – user1270384

+0

. Я понимаю ... – camainc

+0

Это даже не [tag: vbscript], реализация для [tag: vb]. – Lankymart

1

Существует Javascript код, который производит контрольную сумму MD5. Один из них, полученный из библиотеки закрытия Google, - available here.

Довольно легко создать компонент сценария Windows из Javascript, а затем вызвать этот компонент с любого языка с поддержкой COM, включая VB.

Here's a working example.

+0

Спасибо, я тоже попробую это – user1270384

+0

Эти ссылки, кажется, мертвы, fyi –

5

Спасибо за все приведенные выше ссылки, они были полезны, но этот, который я нашел, действительно выполнял эту работу, если кому-нибудь это понадобится. VBScript-MD5

23

Обновление 2017-02-21 - Теперь с добавлением HMACSHA256 для JWTs

Update 2016-07-05 - теперь с добавлением SHA1 и SHA256

справа, для всех из вас, кто боролся с этим (как я) и хочу знать, это возможно!

Следующий код разделен на несколько функций, так что вы можете либо MD5/sha1/sha256 строку, либо файл.

Я позаимствовал функции GetBytes и BytesToBase64 из другого stackexchange, а код внутри stringToUTFBytes основан на другой stackexchange.

function md5hashBytes(aBytes) 
    Dim MD5 
    set MD5 = CreateObject("System.Security.Cryptography.MD5CryptoServiceProvider") 

    MD5.Initialize() 
    'Note you MUST use computehash_2 to get the correct version of this method, and the bytes MUST be double wrapped in brackets to ensure they get passed in correctly. 
    md5hashBytes = MD5.ComputeHash_2((aBytes)) 
end function 

function sha1hashBytes(aBytes) 
    Dim sha1 
    set sha1 = CreateObject("System.Security.Cryptography.SHA1Managed") 

    sha1.Initialize() 
    'Note you MUST use computehash_2 to get the correct version of this method, and the bytes MUST be double wrapped in brackets to ensure they get passed in correctly. 
    sha1hashBytes = sha1.ComputeHash_2((aBytes)) 
end function 

function sha256hashBytes(aBytes) 
    Dim sha256 
    set sha256 = CreateObject("System.Security.Cryptography.SHA256Managed") 

    sha256.Initialize() 
    'Note you MUST use computehash_2 to get the correct version of this method, and the bytes MUST be double wrapped in brackets to ensure they get passed in correctly. 
    sha256hashBytes = sha256.ComputeHash_2((aBytes)) 
end function 

function sha256HMACBytes(aBytes, aKey) 
    Dim sha256 
    set sha256 = CreateObject("System.Security.Cryptography.HMACSHA256") 

    sha256.Initialize() 
    sha256.key=aKey 
    'Note you MUST use computehash_2 to get the correct version of this method, and the bytes MUST be double wrapped in brackets to ensure they get passed in correctly. 
    sha256HMACBytes = sha256.ComputeHash_2((aBytes)) 
end function 

function stringToUTFBytes(aString) 
    Dim UTF8 
    Set UTF8 = CreateObject("System.Text.UTF8Encoding") 
    stringToUTFBytes = UTF8.GetBytes_4(aString) 
end function 

function bytesToHex(aBytes) 
    dim hexStr, x 
    for x=1 to lenb(aBytes) 
     hexStr= hex(ascb(midb((aBytes),x,1))) 
     if len(hexStr)=1 then hexStr="0" & hexStr 
     bytesToHex=bytesToHex & hexStr 
    next 
end function 

Function BytesToBase64(varBytes) 
    With CreateObject("MSXML2.DomDocument").CreateElement("b64") 
     .dataType = "bin.base64" 
     .nodeTypedValue = varBytes 
     BytesToBase64 = .Text 
    End With 
End Function 

'Special version that produces the URLEncoded variant of Base64 used in JWTs. 
Function BytesToBase64UrlEncode(varBytes) 
    With CreateObject("MSXML2.DomDocument").CreateElement("b64") 
     .dataType = "bin.base64" 
     .nodeTypedValue = varBytes 
     BytesToBase64UrlEncode = replace(replace(replace(replace(replace(.Text,chr(13),""),chr(10),""),"+", "-"),"/", "_"),"=", "") 
    End With 
End Function 

Function GetBytes(sPath) 
    With CreateObject("Adodb.Stream") 
     .Type = 1 ' adTypeBinary 
     .Open 
     .LoadFromFile sPath 
     .Position = 0 
     GetBytes = .Read 
     .Close 
    End With 
End Function 

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

BytesToBase64(md5hashBytes(stringToUTFBytes("Hello World"))) 

Производит: sQqNsWTgdUEFt6mb5y4/5Q ==

bytesToHex(md5hashBytes(stringToUTFBytes("Hello World"))) 

Выдает: B10A8DB164E0754105B7A99BE72E3FE5

Для SHA1:

bytesToHex(sha1hashBytes(stringToUTFBytes("Hello World"))) 

Производит: 0A4D55A8D778E5022FAB701977C5D840BBC486D0

Для SHA256:

bytesToHex(sha256hashBytes(stringToUTFBytes("Hello World"))) 

производит: A591A6D40BF420404A011733CFB7B190D62C65BF0BCDA32B57B277D9AD9F146E

Чтобы получить MD5 файла (полезно для Amazon S3 MD5 проверки):

BytesToBase64(md5hashBytes(GetBytes(sPath))) 

Где sPath - это путь к l ocal файл.

И, наконец, создать JWT:

'define the JWT header, needs to be converted to UTF bytes: 
aHead=stringToUTFBytes("{""alg"":""HS256"",""typ"":""JWT""}") 

'define the JWT payload, again needs to be converted to UTF Bytes. 
aPayload=stringToUTFBytes("{""sub"":""1234567890"",""name"":""John Doe"",""admin"":true}") 

'Your shared key. 
theKey="mySuperSecret" 

aSigSource=stringToUTFBytes(BytesToBase64UrlEncode(aHead) & "." & BytesToBase64UrlEncode(aPayload)) 

'The full JWT correctly Base 64 URL encoded. 
aJWT=BytesToBase64UrlEncode(aHead) & "." & BytesToBase64UrlEncode(aPayload) & "." & BytesToBase64UrlEncode(sha256HMACBytes(aSigSource,stringToUTFBytes(theKey))) 

Который будет производить следующее действительное JWT: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.7ofvtkn0z_pTl6WcqRTxw-4eSE3NqcEq9_3ax0YcuIQ

+3

Лучший ответ до сих пор ... Именно то, что я искал, за исключением того, что я использовал bytesToHex (md5hashBytes (GetBytes (sPath))), чтобы получить нужное мне значение из файлов. Отличная компиляция другой работы сэр и лучшая часть заключается в том, что нет необходимости в исполняемом файле или библиотеке. MD5 выравнивается прямо с помощью sigcheck и других исполняемых утилит. –

+0

Это монетный двор. Некоторое время я боролся с этим. Красиво собрано. – GWR

+0

Очень приятно! Именно то, что я хотел найти. Я только добавил эту строку WScript.Echo bytesToHex (sha256hashBytes (GetBytes («путь к моему файлу»))) – Magnus

1

Прежде всего, спасибо SgtWilko! :)

Основываясь на вашей собранной информации, я сделал одну функцию для всех (не для base64/Files).
Ваш код был очень полезен для меня, но я искал более простой PHP-функции для работы с простым текстом и более явным кодом.

Отредактировано:
Основываясь на вопросе How to hash a UTF-8 string in Classic ASP, подхожу с ADODB.Stream раствором. Теперь вы можете использовать неанглийские символы.

Отредактировано:
Параметр PlainText было изменено на Target. Теперь вы можете использовать версии HMAC.
Просто используйте параметр Target как массив.

Target(0) = PlainText 
Target(1) = SharedKey 

Еще раз спасибо SgtWilko;)

Announcing the first SHA1 collision (блог Google Security) 23 февраля 2017 года.

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

Function Hash(HashType, Target) 
    On Error Resume Next 

    Dim PlainText 

    If IsArray(Target) = True Then PlainText = Target(0) Else PlainText = Target End If 

    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 "md5": Set Cryptography = CreateObject("System.Security.Cryptography.MD5CryptoServiceProvider") '< 64 (collisions found) 
     Case "ripemd160": Set Cryptography = CreateObject("System.Security.Cryptography.RIPEMD160Managed") 
     Case "sha1": Set Cryptography = CreateObject("System.Security.Cryptography.SHA1Managed") '< 80 (collision found) 
     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 "md5HMAC": Set Cryptography = CreateObject("System.Security.Cryptography.HMACMD5") 
     Case "ripemd160HMAC": Set Cryptography = CreateObject("System.Security.Cryptography.HMACRIPEMD160") 
     Case "sha1HMAC": Set Cryptography = CreateObject("System.Security.Cryptography.HMACSHA1") 
     Case "sha256HMAC": Set Cryptography = CreateObject("System.Security.Cryptography.HMACSHA256") 
     Case "sha384HMAC": Set Cryptography = CreateObject("System.Security.Cryptography.HMACSHA384") 
     Case "sha512HMAC": Set Cryptography = CreateObject("System.Security.Cryptography.HMACSHA512") 
    End Select 

    Cryptography.Initialize() 

    If IsArray(Target) = True Then Cryptography.Key = UTF8Encoding.GetBytes_4(Target(1)) 

    BytesToHashedBytes = Cryptography.ComputeHash_2((PlainTextToBytes)) 

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

    If Err.Number <> 0 Then Response.Write(Err.Description) Else Hash = LCase(HashedBytesToHex) 

    On Error GoTo 0 
End Function 

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

Hash("sha512", "Hello World") 

Выдает:
2c74fd17edafd80e8447b0d46741ee243b7eb74dd2149a0ab1b9246fb30382f27e853d8585719e0e67cbda0daa8f51671064615d645ae27acb15bfb1447f459b

Hash("sha256", "Hello World") 

Выдает:
a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e

Hash("md5", "muñeca") 

Выдает:
ea07bec1f37f4b56ebe368355d1c058f

Hash("sha512HMAC", Array("Hello World", "Shared Key")) 

Производит:
28e72824c48da5a5f14b59246905d2839e7c50e271fc078b1c0a75c89b6a3998746bd8b2dc1764b19d312702cf5e15b38ce799156af28b98ce08b85e4df65b32

+0

Рад, что я мог бы помочь. Вы можете быть в состоянии обойти вопрос UTF-8, установив кодовую & кодовую в файле ASP: Response.CodePage = 65001 Response.Charset = «UTF-8» и если вы установите его в session asp также правильно интерпретирует ответы: Session.Codepage = 65001 – SgtWilko