4

Вопрос по encryption, vba, javascript – 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=
  • Error: User Rate Limit Exceeded

    от HK1
  • Error: User Rate Limit Exceeded

    от HK1
  • Error: User Rate Limit Exceeded

    от HK1
  • Error: User Rate Limit Exceeded

    от
  • Я хочу добавить, что эта функция необходима для OAuth 1.0, но не является необходимой для OAuth 2.0.

    от HK1
  • 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

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

  • 5

    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

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