Вопрос по javascript, vba, encryption – Base64 HMAC SHA1 String в VBA

4

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

<code>Get_Signature = b64_hmac_sha1(strSecret, strBaseSignature)
</code>

Эта функция, 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:
Итак, вот функции, которые я в итоге написал и использовал:

<code>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
</code>

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

<code>Debug.Print Base64_HMACSHA1("abc", "123")
VAsMU9SSWDe9krP3Gr56nXC2dsQ=
</code>
Я хочу добавить, что эта функция необходима для OAuth 1.0, но не является необходимой для OAuth 2.0. HK1

Ваш Ответ

2   ответа
5

Код аутентификации сообщения (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

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

Error: User Rate Limit Exceeded HK1
Error: User Rate Limit Exceeded HK1
Error: User Rate Limit Exceeded
0

It appears to me that calling a JavaScript function from VBA is fairly impractical.

Это ошибочное суждение.

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

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

Поэтому ваша проблема должна быть легко решаемой.

Error: User Rate Limit Exceeded HK1

Похожие вопросы