서론
업비트 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)
그리고 base64로 인코딩하는 것도 있습니다.
How do I base64 encode a string efficiently using Excel VBA? - Stack Overflow
이것을 참고하였습니다.
이제 아래 한번 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의 값과 살짝은 다릅니다. 하지만 디코딩 사이트를 통해서 해봤을 때 결과 값은 동일하게 나오는군요
그리고 이제 마지막 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를 엑셀로 만들 수 있게 되었으니 다음 작업들을 진행하겠습니다.
'엑셀 > VBA' 카테고리의 다른 글
VBA 웹 크롤링 하기 - InternetExplorer 사용 (1) | 2021.04.23 |
---|---|
VBA,엑셀 로 SHA512 HASH 하기 (0) | 2021.04.20 |
크롤링 중 Response Text가 "대상 멀티바이트 코드페이지에 유니코드 문자의 매핑이 없습니다." 라고 나올때 해결방법 - VBA (0) | 2021.04.19 |
VBA 배우기 기초 - 상대 참조 및 녹화 코드분석 (0) | 2021.04.06 |
엑셀과 VBA를 사용하여 텍스트파일 합치기 (0) | 2021.03.21 |
댓글