Base64 HMAC SHA1 String в VBA

Я пытаюсь преобразовать библиотеку OAuth ASP / VBScript в VBA. Одна из проблем - это строка кода:

Get_Signature = b64_hmac_sha1(strSecret, strBaseSignature)

Эта функция, b64_hmac_sha1, на самом деле является функцией, содержащейся в библиотеке JavaScript. Мне кажется, что вызывать функцию JavaScript из VBA довольно непрактично.

Поскольку я так мало знаю о шифровании, мне даже не ясно, что делает эта функция b64_hmac_sha1. HMAC SHA1 отличается от SHA1?

Я наполовину подозреваю, что смогу найти в Интернете какой-нибудь код VBA, чтобы делать то, что мне нужно, если бы я просто понял, что на самом деле делает эта функция. Если я не найду существующую функцию, я мог бы написать такую, которая бы использовала бы библиотеку криптографии .NET (вы действительно можете вызвать библиотеки криптографии .NET из VBA, если знаете как).

Я не ищу кого-нибудь, кто бы преобразовал этот JavaScript в VBA. Я только пытаюсь понять, что именно выводит эта функция b64_hmac_sha1, поэтому я могу попытаться найти способы добиться того же результата в VBA, если это возможно.

Копия этой библиотеки JavaScript доступна на этом веб-сайте. Вам нужно будет прокрутить вниз от VBScript до раздела JavaScript. http://solstice.washington.edu/solstice/ASP_Signing_REST_Example

Edit1:
Хорошо, вот функции, которые я написал и использовал:

Public Function Base64_HMACSHA1(ByVal sTextToHash As String, ByVal sSharedSecretKey As String)

    Dim asc As Object, enc As Object
    Dim TextToHash() As Byte
    Dim SharedSecretKey() As Byte
    Set asc = CreateObject("System.Text.UTF8Encoding")
    Set enc = CreateObject("System.Security.Cryptography.HMACSHA1")

    TextToHash = asc.Getbytes_4(sTextToHash)
    SharedSecretKey = asc.Getbytes_4(sSharedSecretKey)
    enc.Key = SharedSecretKey

    Dim bytes() As Byte
    bytes = enc.ComputeHash_2((TextToHash))
    Base64_HMACSHA1 = EncodeBase64(bytes)
    Set asc = Nothing
    Set enc = Nothing

End Function

Private Function EncodeBase64(ByRef arrData() As Byte) As String

    Dim objXML As MSXML2.DOMDocument
    Dim objNode As MSXML2.IXMLDOMElement

    Set objXML = New MSXML2.DOMDocument

    ' byte array to base64
    Set objNode = objXML.createElement("b64")
    objNode.DataType = "bin.base64"
    objNode.nodeTypedValue = arrData
    EncodeBase64 = objNode.Text

    Set objNode = Nothing
    Set objXML = Nothing

End Function

Используя эту функцию:

Debug.Print Base64_HMACSHA1("abc", "123")
VAsMU9SSWDe9krP3Gr56nXC2dsQ=

person HK1    schedule 09.04.2012    source источник
comment
Хочу добавить, что эта функция необходима для OAuth 1.0, но не нужна для OAuth 2.0.   -  person HK1    schedule 09.04.2012


Ответы (2)


HMAC - это конструкция для превращения хэш-функции, такой как SHA1, в код аутентификации сообщения (MAC ).

Обычные хэш-функции не имеют связанных с ними секретных данных. Это означает, что любой может вычислить дайджест, если у него есть исходные данные. HMAC использует секретный ключ, так что только те, кто владеет ключом, могут вычислять выходные данные.

Предположим, у меня есть файл file.txt. Я хочу отправить это вам, и мы должны убедиться, что никто не вмешивается в это. Извините, у меня нет умного способа представить это простым текстом.

me -> file.txt -> you
me -> SHA1(file.txt) -> you

Затем вы проверяете результат, вычисляя свой собственный дайджест SHA1 и проверяя его соответствие тому, что я вам отправил.

Теперь предположим, что атакующий находится в центре. К сожалению, поскольку здесь нет никакого секрета, злоумышленник может изменить файл и вычислить свою собственную пару файл / дайджест. Когда вы вычислите свою версию, она будет соответствовать тому, что он вам прислал, и вы не станете мудрее.

me -> file.txt -> attacker -> modified.txt -> you
me -> SHA1(file.txt) -> attacker -> SHA1(modified.txt) -> you

С HMAC мы добавляем секретный ключ к вычислению.

me -> file.txt -> you
me -> SHA1_HMAC(file.txt, our_secret) -> you

Когда вы вычисляете свою версию, вы также применяете секретный ключ, и результат совпадает. Злоумышленник, не зная ключа, не может заменить дайджест.

me -> file.txt -> attacker -> modified.txt -> you 
me -> SHA1(file.txt) -> attacker -> SHA1_HMAC(modified.txt, // DOESN'T KNOW KEY) -> you

HMAC - это очень специфический способ добавления секретного ключа. К сожалению, простые методы простого объединения ключа в конец файла или его предварительного ожидания перед хешированием уязвимы для различных атак (например, атак с расширением длины).

B64 - это кодировка Base64 для вывода, чтобы сделать его красивым.

В конечном итоге этот код принимает некоторые входные данные и секретный ключ, вычисляет 160-битный дайджест и кодирует результат в формате base64.

Существует реализация SHA1 HMAC в .NET

Это похоже на реализацию Base64 для VBA

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

person mfanto    schedule 09.04.2012
comment
Спасибо за вашу помощь. Я написал свои функции и разместил их в своем вопросе в разделе Edit1. - person HK1; 09.04.2012
comment
Рад, что помог. Все работает? Насколько я могу судить, порядок выглядит правильным, хотя я никогда не писал VB или VBA. - person mfanto; 09.04.2012
comment
Наверное, я не знаю наверняка, правильно он работает или нет. Я выложу пример. - person HK1; 09.04.2012

Ты написал:

Мне кажется, что вызывать функцию JavaScript из VBA довольно непрактично.

Это неверное суждение.

Javascript можно легко упаковать как компонент сценария Windows (WSC), а затем вызвать через COM, из VBA, Perl, VB6 или еще чего-нибудь.

Вот пример упаковки Javascript как WSC и его вызова: https://stackoverflow.com/a/849970/48082

Следовательно, ваша проблема должна легко решаться.

person Cheeso    schedule 09.04.2012
comment
Я действительно сталкивался с этим вариантом. Думаю, я не без ума от вызова внешнего COM-сервера, если в этом нет крайней необходимости. - person HK1; 09.04.2012