본문 바로가기
ABAP/소스코드

[ABAP] HMAC 암호화(HMACSHA256) 소스코드

by name_text 2023. 5. 9.

HMAC 암호화(HMACSHA256) 소스코드

CL_APL_TESTZONE_SERVICES=>CONVERT_ABAP_TIMESTAMP_TO_JAVA

CL_APL_ECATT_JSERVICES=>CONVERT_ABAP_TIMESTAMP_TO_JAVA

CL_ABAP_HMAC=>CALCULATE_HMAC_FOR_CHAR

네이버클라우드(Ncloud)

 

SAP에서 네이버클라우드(Ncloud)의 API를 호출하기 위해서는 "x-ncp-apigw-signature-v2" 부분에 HMAC 알고리즘을 이용한 암호화 값을 넣어줘야 정상적인 호출이 가능합니다.

 

Ncloud(https://api.ncloud-docs.com/docs/common-ncpapi) 에서 제공하는 가이드와 SAP의 Class Method와 Function을 이용하여 Timestamp를 구하고 HMACSHA256으로 암호화 및 Base64 인코딩까지 하는 소스코드 예시를 작성하였습니다.

 

#1. 네이버클라우드(Ncloud) API 호출시 헤더형식 및 시그니처 생성 가이드

Ncloud 시그니처 생성 가이드(https://api.ncloud-docs.com/docs/common-ncpapi)

#2. 소스코드

CL_APL_TESTZONE_SERVICES 클래스는 고객사 SAP 환경에 따라 없을 수 있습니다.

이경우, CL_APL_ECATT_JSERVICES 클래스를 사용하시면 됩니다.

DATA: LV_METHOD    TYPE STRING,
      LV_URL       TYPE STRING,
      LV_ACCESSKEY TYPE STRING,
      LV_SECRETKEY TYPE STRING.

LV_METHOD = 'GET'.
LV_URL = '/photos/puppy.jpg?query1=&query2'.
LV_ACCESSKEY = 'D78BB444D6D3C84CA38D'.
LV_SECRETKEY = 'FsCwKN92Ob0SsTWdaZOPzKo6ZGSrmjt2nBk1a2jH'.

*1970년 1월 1일 00:00:00 협정 세계시(UTC)부터의 경과 시간을 밀리초(Millisecond)
"CL_APL_ECATT_JSERVICES 클래스가 없으면 CL_APL_TESTZONE_SERVICES 사용
CL_APL_ECATT_JSERVICES=>CONVERT_ABAP_TIMESTAMP_TO_JAVA(
  exporting
    IM_DATE      = SY-DATUM    " Date Data Element for SYST
    IM_TIME      = SY-UZEIT    " Date and Time, Current Application Server Time
*    IM_MSEC      = 000    " Remaining Milliseconds
  importing
    EX_TIMESTAMP = DATA(LV_TIMESTAMP)    " Time in Milliseconds since January 1, 1970, 00:00:00 GMT
).

CONCATENATE LV_METHOD
            ` `
            LV_URL
            CL_ABAP_CHAR_UTILITIES=>NEWLINE
            LV_TIMESTAMP
            CL_ABAP_CHAR_UTILITIES=>NEWLINE
            LV_ACCESSKEY INTO DATA(LV_DATA).

CL_ABAP_HMAC=>CALCULATE_HMAC_FOR_CHAR(
  EXPORTING
    IF_ALGORITHM           = 'SHA256'
    IF_KEY                 = CL_BCS_CONVERT=>STRING_TO_XSTRING( LV_SECRETKEY )
    IF_DATA                = LV_DATA
  IMPORTING
    EF_HMACSTRING          = DATA(LV_HMACSTRING)
    EF_HMACXSTRING         = DATA(LV_HMACXSTRING)
    EF_HMACB64STRING       = DATA(LV_HMACB64STRING)
).

CL_DEMO_OUTPUT=>NEW(
  )->NEXT_SECTION( 'Original string'
  )->WRITE( LV_DATA
  )->NEXT_SECTION( 'HMACSHA256 encrypted string'
  )->WRITE( LV_HMACSTRING
  )->WRITE( LV_HMACXSTRING
  )->WRITE( LV_HMACB64STRING
  )->NEXT_SECTION( 'Base64 Encoded string'
  )->WRITE( CL_HTTP_UTILITY=>ENCODE_BASE64( LV_HMACSTRING )
  )->WRITE( CL_HTTP_UTILITY=>ENCODE_X_BASE64( LV_HMACXSTRING )
  )->WRITE( CL_HTTP_UTILITY=>ENCODE_BASE64( LV_HMACB64STRING )
  )->DISPLAY( ).

댓글