서명 버전 4에 대한 서명 키 생성 방법을 보여주는 예 - AWS 일반 참조

문서의 영문과 번역 사이에 충돌이 있는 경우에는 영문 버전을 따릅니다. 번역 버전은 기계 번역을 사용하여 제공합니다.

서명 버전 4에 대한 서명 키 생성 방법을 보여주는 예

이 페이지에는 다양한 프로그래밍 언어로 서명 버전 4에 대한 서명 키를 생성하는 방법을 보여주는 예가 나와 있습니다. 이 페이지의 예에서는 AWS 요청에 서명하는 과정으로써 서명 키를 생성하는 방법만 보여줍니다. 전체 프로세스를 보여주는 예는 전체 서명 버전 4 서명 프로세스 예(Python) 단원을 참조하십시오.

중요

AWS SDK 중 하나를 사용할 경우(Java용 SDK, .NET, Python, Ruby 또는 JavaScript 포함) 서명 키를 생성하고 인증 정보를 요청에 추가하는 단계를 수동으로 수행할 필요가 없습니다. SDK에서 이 작업을 자동으로 수행합니다. HTTP 또는 HTTPS를 직접 요청하는 경우에만 요청에 수동으로 서명해야 합니다.

Java를 사용하여 서명 키 생성

static byte[] HmacSHA256(String data, byte[] key) throws Exception { String algorithm="HmacSHA256"; Mac mac = Mac.getInstance(algorithm); mac.init(new SecretKeySpec(key, algorithm)); return mac.doFinal(data.getBytes("UTF-8")); } static byte[] getSignatureKey(String key, String dateStamp, String regionName, String serviceName) throws Exception { byte[] kSecret = ("AWS4" + key).getBytes("UTF-8"); byte[] kDate = HmacSHA256(dateStamp, kSecret); byte[] kRegion = HmacSHA256(regionName, kDate); byte[] kService = HmacSHA256(serviceName, kRegion); byte[] kSigning = HmacSHA256("aws4_request", kService); return kSigning; }

.NET(C#)을 사용하여 서명 키 생성

static byte[] HmacSHA256(String data, byte[] key) { String algorithm = "HmacSHA256"; KeyedHashAlgorithm kha = KeyedHashAlgorithm.Create(algorithm); kha.Key = key; return kha.ComputeHash(Encoding.UTF8.GetBytes(data)); } static byte[] getSignatureKey(String key, String dateStamp, String regionName, String serviceName) { byte[] kSecret = Encoding.UTF8.GetBytes(("AWS4" + key).ToCharArray()); byte[] kDate = HmacSHA256(dateStamp, kSecret); byte[] kRegion = HmacSHA256(regionName, kDate); byte[] kService = HmacSHA256(serviceName, kRegion); byte[] kSigning = HmacSHA256("aws4_request", kService); return kSigning; }

Python을 사용하여 서명 키 생성

def sign(key, msg): return hmac.new(key, msg.encode("utf-8"), hashlib.sha256).digest() def getSignatureKey(key, dateStamp, regionName, serviceName): kDate = sign(("AWS4" + key).encode("utf-8"), dateStamp) kRegion = sign(kDate, regionName) kService = sign(kRegion, serviceName) kSigning = sign(kService, "aws4_request") return kSigning

Ruby를 사용하여 서명 키 생성

def getSignatureKey key, dateStamp, regionName, serviceName kDate = OpenSSL::HMAC.digest('sha256', "AWS4" + key, dateStamp) kRegion = OpenSSL::HMAC.digest('sha256', kDate, regionName) kService = OpenSSL::HMAC.digest('sha256', kRegion, serviceName) kSigning = OpenSSL::HMAC.digest('sha256', kService, "aws4_request") kSigning end

JavaScript(Node.js)를 사용하여 서명 키 생성

다음 예에서는 crypto-js 라이브러리를 사용합니다. 자세한 내용은 https://www.npmjs.com/package/crypto-jshttps://code.google.com/archive/p/crypto-js/를 참조하십시오.

var crypto = require("crypto-js"); function getSignatureKey(key, dateStamp, regionName, serviceName) { var kDate = crypto.HmacSHA256(dateStamp, "AWS4" + key); var kRegion = crypto.HmacSHA256(regionName, kDate); var kService = crypto.HmacSHA256(serviceName, kRegion); var kSigning = crypto.HmacSHA256("aws4_request", kService); return kSigning; }

다른 언어를 사용하여 서명 키 생성

이 로직을 다른 프로그래밍 언어로 구현해야 하는 경우 키 파생 알고리즘의 중간 단계를 이 섹션의 값과 비교하여 테스트하는 것이 좋습니다. 다음 Ruby 예에서는 알고리즘의 각 단계를 수행한 이후에 hexEncode 함수를 사용하여 결과를 인쇄합니다.

def hexEncode bindata result="" data=bindata.unpack("C*") data.each {|b| result+= "%02x" % b} result end

테스트 입력은 다음과 같습니다.

key = 'wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY' dateStamp = '20120215' regionName = 'us-east-1' serviceName = 'iam'

프로그램에서 getSignatureKey의 값에 대해 다음 값을 생성해야 합니다. 이러한 값은 이진 데이터의 16진수로 인코딩된 표현이며, 키와 중간 값은 이진 형식이어야 합니다.

kSecret = '41575334774a616c725855746e46454d492f4b374d44454e472b62507852666943594558414d504c454b4559' kDate = '969fbb94feb542b71ede6f87fe4d5fa29c789342b0f407474670f0c2489e0a0d' kRegion = '69daa0209cd9c5ff5c8ced464a696fd4252e981430b10e3d3fd8e2f197d7a70c' kService = 'f72cfd46f26bc4643f06a11eabb6c0ba18780c19a8da0c31ace671265e3c87fa' kSigning = 'f4780e2d9f65fa895f9c67b32ce1baf0b0d8a43505a000a1a9e090d414db404d'

일반적인 코딩 오류

작업을 단순화하기 위해 다음과 같은 일반적인 코딩 오류를 방지하십시오.

작은 정보

원시 HTTP 요청을 보여주는 도구를 사용하여 AWS에 전송 중인 HTTP 요청을 검사합니다. 그러면 코드에서 눈에 띄지 않는 문제를 파악하는 데 도움이 됩니다.

  • 줄 바꿈 문자를 추가하거나 빠뜨리지 마십시오.

  • 자격 증명 범위에서 날짜의 서식을 올바르게 지정하십시오. 예를 들어, YYYYMMDD 형식 대신 타임스탬프를 사용하지 마십시오.

  • 표준 헤더와 서명된 헤더가 동일한지 확인합니다.

  • 중간 키를 계산할 때 키와 데이터(메시지)를 실수로 스왑하지 마십시오. 이전 단계의 계산 결과는 데이터가 아닌 키입니다. 암호화 프리미티브에 대한 설명서를 참조하여 파라미터가 올바른 순서로 배치되는지 신중하게 확인하십시오.

  • 첫 번째 단계에서 키의 앞에 "AWS4" 문자열을 추가하는 것을 잊지 마십시오. for 루프 또는 반복기를 사용하여 키를 생성할 경우 첫 번째 반복에 "AWS4" 문자열을 포함하는 특수한 사례를 잊지 마십시오.

가능한 오류에 대한 자세한 내용은 AWS 서명 버전 4 오류 해결 단원을 참조하십시오.