web-dev-qa-db-ja.com

従来のASPでVBScriptを使用してMD5を生成する方法は?

アプリケーションでMD5を生成する必要があります。

私はグーグルを試しましたが、MD5のPHPコードのみを見つけました。MD5ハッシュを使用して検証するクライアントシステムに接続する必要がありますが、コードはPHPであり、私のコードはクラシックですASP VBScriptを使用。

私のサーバーは.Netでサポートされているため、PHPスクリプトを使用できません。ClassicASPのVBScript用のそのようなMD5コードはありますか?

12
user1270384

テストする方法がないので、このコードが機能するかどうかはわかりません。しかし、それはあなたが求めているもののようです。

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

これは、ハッシュに関するJeffAttwoodによる興味深い記事です。彼はMD5についていくつか重要なことを言っています。

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

3
camainc

更新2017-02-21-JWT用のHMACSHA256が追加されました

更新2016-07-05-SHA1とSHA256が追加されました

そうです、これに苦労していて(私のように)知りたいと思っているすべての人にとって、それは可能です!

次のコードはいくつかの関数に分割されているため、MD5/sha1/sha256は文字列またはファイルのいずれかになります。

別のスタックエクスチェンジから関数GetBytesとBytesToBase64を借用しましたが、stringToUTFBytes内のコードは別のスタックエクスチェンジに基づいています。

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はローカルファイルへのパスです。

そして最後に、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が生成されます。

32
SgtWilko

これは、VBSスクリプトとしてのMD5の読み取り可能でダウンロード可能なバージョンです。

https://github.com/Wikinaut/md5.vbs

これは http://chayoung.tistory.com/entry/VBScript-MD5 からのコードです(このユニークなコードに感謝します)。

5
Wikinaut

上記のすべてのリンクに感謝します、それらは役に立ちました、しかし私が見つけたこれは誰かがそれを必要とするならば本当に仕事をしました。 VBScript-MD5

5
user1270384

まず第一に、ありがとう SgtWilko ! :)

収集した情報に基づいて、すべてに対して1つの機能を実行しました(base64 /ファイルではありません)。
あなたのコードは私にとって非常に役に立ちましたが、プレーンテキストとより明示的なコードを処理するためのより多くのPHP同様の(単純な)関数を探していました。

編集:
問題に基づいて クラシックASPでUTF-8文字列をハッシュする方法 、私はADODB.Streamソリューションを思いつきます。英語以外の文字を使用できるようになりました。

編集:
パラメータPlainTextTargetに変更されました。これで、[〜#〜] hmac [〜#〜]バージョンを使用できます。
Targetパラメーターを配列として使用するだけです。

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

もう一度ありがとう SgtWilko ;)

最初のSHA1衝突の発表 (Googleセキュリティブログ)2017年2月23日。

この関数を使用すると、プレーンテキストを次のようにハッシュできます。
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

3
Tiago Perez

MD5チェックサムを生成するJavascriptコードがあります。 Googleのクロージャーライブラリから派生したものの1つは、 ここで入手可能 です。

JavascriptからWindowsスクリプトコンポーネントを作成し、VBを含むCOM対応言語からそのコンポーネントを呼び出すのは非常に簡単です。

これが実際の例です

1
Cheeso