본문 바로가기
엑셀/VBA

vba 로 jwt 만들기 , 만드는 방법 - hs256

by 큐브빌드 2021. 4. 19.
반응형

서론

업비트 api를 엑셀로 적용하려고 하다 보니 jwt를 만들어야 합니다.

 

jwt.io 사이트를 활용하여 jwt를 만들어 낼 수 있습니다.

 

하지만 추후 코인을 구매하고 코인을 판매할 때 다양한 주소들을 사이트를 통해 만들어낼 수 없을 것 같아서 vba로 만드는 방법이 없을까 하고 요 며칠간 계속 구글링을 하였습니다.

 


결론

특이하게 이번에는 결론부터 이야기하자면 만들어낼 수 있습니다.

 

일단 jwt.io 사이트를 자세히 바라봤습니다.

HEADER (붉은색). PAYLOAD (핑크색). VERIFY SIGNATURE(파란색) 

이렇게 점으로 연결되어 있습니다.

 

그리고 jwt.io 사이트의 VERIFY SIGNATURE을 보니 HMACSHA256이란 게 있네요

 

SHA256의 인코드를 사용하는 것 같습니다. 

 

또한 그 안에 base64 Url Encode(header)와 base64 Url Encode(payload)를 보니 

 

header와 payload는 base64로 인코드 하는 거 같습니다.

 

그래서 VBA로 sha256을 인코딩할 수 있는 방법을 찾았습니다.

 

Excel VBA Base64 HMAC SHA256 and SHA1 Encryption - Excel Macros (excelhowto.com)

 

Excel VBA Base64 HMAC SHA256 and SHA1 Encryption - Excel Macros

VBA Base64 HMAC SHA256 and SHA1 To use this code, you need do this: Inside the VBE, Go to Tools -> References, then Select Microsoft XML, v6.0 (or

www.excelhowto.com

그리고 base64로 인코딩하는 것도 있습니다.

 

How do I base64 encode a string efficiently using Excel VBA? - Stack Overflow

 

How do I base64 encode a string efficiently using Excel VBA?

I need to encode a 100KB+ string as base64 in VBA. Are there any built-in functions or COM objects available which will do this as a pure VBA approach is either complex or doesn't scale well at these

stackoverflow.com

이것을 참고하였습니다.

 

이제 아래 한번 Base64부터 하나씩 인코딩해보겠습니다.


본론

위 2개 사이트를 가지고 코드를 비교했는데 공통인 부분이 Base64로 인코딩하는 코드가 유사합니다.

 

 

 

 

차이점은 1개는 StrConv로 텍스트를 컨버팅하고 하나는 컨버팅 하지 않는 상태입니다.

 

결과적으로 컨버팅 한 게 정확하게 나와서 컨버팅 코드를 사용했습니다. 

※ 아래 EncodeBase64 코드 이므로 생략했습니다.

 

사용하기 위해서는 Microsoft XML , v3.0을 등록해야 합니다.

중복해서 등록하면 안 되고 v3.0 하나만 등록하면 진행됩니다. (v6.0과 중복 안됩니다.)

도구 > 레퍼런스 메뉴에 들어가서 추가했습니다.

 

그리고 Function 이기 때문에 엑셀 자체에서도 사용이 가능합니다. 그래서 코드가 잘 들어갔는지 정확히 인코딩 되는지 테스트 한번 해보겠습니다.

 

jwt.io 홈페이지와 비교하여 테스트해보겠습니다.

 

일단 Header를 만들어보겠습니다.

 

Header = {"alg":"HS256", "typ":"JWT"}

 

이건 고정이기 때문에 사실 그대로 사용해도 되겠지만 한번 테스트를 위해서 만들어보겠습니다.

 

이렇게 적용하였습니다. 그랬더니 나오는 코드는 코드는 동일합니다.

 

base64로 인코딩이 잘 되고 있는 것 같습니다.

 

그리고 이제 Header 다음인 PayLoad를 만들어 보겠습니다.

 

Payload는 상황에 따라 다르게 사용되는데요 jwt.io 사이트와 비교하기 위해서 jwt.io에 사용되는 Payload를 넣었습니다.

 

PayLoad = {"sub": "1234567890", "name": "John Doe", "iat": 1516239022}입니다.

 

※ payload에서는 계속 줄 바꿈이 일어나서 줄 바꿈을 제거하는 코드를 추가했습니다. 그것은 아래 코드에 포함되어 있습니다.

 

음... jwt.io의 값과 살짝은 다릅니다. 하지만 디코딩 사이트를 통해서 해봤을 때 결과 값은 동일하게 나오는군요

JSON Web Token (JWT)

 

Gain control over your JWTs

With JSONwebtoken.io, you can easily encode, decode, and validate JWTs.

www.jsonwebtoken.io

 

그리고 이제 마지막 VERIFY SIGNATURE입니다.

 

얘는 base64 Url Encode(header) + "." + base64 Url Encode(payload), your-256-bit-secret입니다.

 

+는 아마 텍스트를 연결해주는 인자 같습니다. c#이었는지 C++ 이였는지 JAVA였는지 기억은 안 나지만 디버깅 볼 때 사용했던 것으로 그 억 합니다.

그래서 VBA에서는 &로 연결하였습니다.

여기서 코드를 하나 수정했습니다.

base64_hmacsha256은 byte형태로 encodebase64로 넘겨주고 있습니다.

※ Dim bytes() as byte에서 byte형태로 지정되어 있습니다.

여기 부분이죠

 

근데 encodebase64는 앞서 수정을 하여 byte로 변경하는 코드가 있습니다. 그래서 해당 부분을 사용하지 않도록 해야 됩니다.

 

그래서 이 부분을 수정했습니다.

text라는 타입이 byte 이면 arrData = text 동일하게 사용하는 것으로 변경했습니다.

Function EncodeBase64(text) As String 
Dim arrData() As Byte
Dim resulttext
arrData = StrConv(text, vbFromUnicode)
If TypeName(text) = "Byte()" Then
arrData = text
End If
Dim objXML As MSXML2.DOMDocument
Dim objNode As MSXML2.IXMLDOMElement
Set objXML = New MSXML2.DOMDocument
Set objNode = objXML.createElement("b64")
objNode.DataType = "bin.base64"
objNode.nodeTypedValue = arrData
If InStr(objNode.text, Chr(10)) > 0 Then
resulttext = Replace(objNode.text, Chr(10), "")
ElseIf InStr(objNode.text, Chr(13)) > 0 Then
resulttext = Replace(objNode.text, Chr(13), "")
Else
resulttext = objNode.text
End If
EncodeBase64 = resulttext
Set objNode = Nothing
Set objXML = Nothing
End Function
Public Function Base64_HMACSHA256(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.HMACSHA256")
TextToHash = asc.Getbytes_4(sTextToHash)
SharedSecretKey = asc.Getbytes_4(sSharedSecretKey)
enc.Key = SharedSecretKey
Dim bytes() As Byte
bytes = enc.ComputeHash_2((TextToHash))
Base64_HMACSHA256 = EncodeBase64(bytes)
Set asc = Nothing
Set enc = Nothing
End Function

이렇게 되었습니다.

그러면 이제 SHA256 코드로 변경하는 것도 포함되었습니다.

 

자 그러면 또 테스트해봐야겠네요

 

근데 payload부터 값이 살짝 달라졌기 때문에 jwt.io에 존재하는 값을 들고 와서 테스트해보겠습니다.

 

비슷한 듯 비슷하지 않은 듯 비슷합니다.

 

= 이 계속 붙어서 나오네요.

 

하지만 큰 문제는 없어 보입니다.

 

왜냐면 디코더 사이트에서 확인해봤습니다~!

짜잔 signing key에 abcdefghijklmn을 넣는 순간 확인한다고 나옵니다~

 

이렇게 해서 jwt를 hs256으로 생성이 가능합니다.

 

그리고 제가 직접 만든 것도 테스트해보니 통과되었습니다~!

 

엑셀 파일은 첨부하며 혹시라도 공부하실 분은 공부하시면 될 것 같습니다~!

jwt만들기.xlsm
0.02MB

그러면 이제 jwt를 엑셀로 만들 수 있게 되었으니 다음 작업들을 진행하겠습니다.

반응형

댓글