JSON 웹 서명 규범 해석

JWS 즉 Json Web Signature 는 JWT 를 구성 하 는 기초 구조 (JWT 는 사실 JWS 와 JWE 두 가 지 를 포함 하 는데 그 중에서 JWT 의 부하 가 포 함 된 JWT 일 수도 있다) 로 세 부분 인 JOSE Header, JWS Payload, JWS Signature 를 포함한다.
여기 서 Signature 는 두 가지 생 성 방식 이 있 는데 하 나 는 표준 서명 이 고 비대 칭 암호 화 를 사용 할 수 있 습 니 다. 비밀 키 의 비밀 성 때문에 서명 의 주 체 를 확인 할 수 있 고 완전 성 을 보호 할 수 있 습 니 다.다른 하 나 는 메시지 인증 코드 MAC (Message Authentication Code) 으로, 이 비밀 키 는 발 급 · 검증 한 여러 주체 간 에 공유 해 야 하기 때문에 발 급 된 주 체 를 확인 할 수 없고 완전 성 을 보호 하 는 역할 만 할 수 있다.
JWS 는 최종 적 으로 두 가지 직렬 화 된 표현 형식 이 있 는데 하 나 는 JWS Compact Serialization 으로 한 줄 의 문자 이다.다른 하 나 는 JWS JSON Serialization 으로 같은 콘 텐 츠 에 여러 개의 서명 / 메시지 인증 코드 를 생 성 할 수 있 는 표준 Json 대상 이다.
JWS Compact Serialization, 각 부분 은 '' 로 구 분 됩 니 다.
BASE64URL(UTF8(JWS Protected Header)) || ’.’ ||
BASE64URL(JWS Payload) || ’.’ ||
BASE64URL(JWS Signature)
JWS Json Serialization 은 두 개의 피 드 형식 으로 나 눌 수 있 습 니 다. 통용 되 고 납작 합 니 다.
일반적인 형식 으로 가장 바깥쪽 은 payload, signatures 입 니 다.signatures 에는 여러 개의 json 대상 이 포함 되 어 있 으 며, 내부 의 json 대상 은 proctected, header, signature 로 구성 되 어 있다.서로 다른 proctected header 는 서로 다른 Signature 를 생 성 합 니 다.
{
    "payload": "",
    "signatures": 
    [
        {
            "protected": "",
            "header": "",
            "signature": ""
        },
        ...
        {
            "protected": "",
            "header": "",
            "signature": ""
        }
    ]
}

평면 형식 은 하나의 signature / mac 만 을 위 한 것 입 니 다.
{
    "payload": "",
    "protected": "",
    "header": "",
    "signature": ""
}

JOSE Header:Json Object Signing and Encryption Header。암호 화 행위 및 기타 사용 되 는 매개 변 수 를 설명 하 는 것 은 JWS Protected / Unproctected Header 의 집합 입 니 다.
JWS Protected Header, 완전 하 게 보 호 된 헤드 인자 가 있 습 니 다.
JWS Unprotected Header, 완전 성 보호 헤드 인자 없 이 JWS Json Serialization 형식 에 만 나타 납 니 다.
아래 의 JOSE Header 에 규정된 매개 변 수 를 제시 하 였 으 며, 각 매개 변수 에 대한 상세 한 정 보 는 rfc 7515 를 참고 하 시기 바 랍 니 다.
헤드 매개 변수
전 칭
해명 하 다.
반드시 선택한다
alg
algorithm
서명 알고리즘 을 none 으로 지정 할 때 서명 을 사용 하지 않 고 완전 성 을 보호 합 니 다.
예.
jku
JWK set URL
서명 에 사 용 된 key 는 숟가락 이 있 는 URI 에 대응 합 니 다.
아니.
jwk
json web key
키 에 대응 하 는 수 저 를 서명 합 니 다.
아니.
kid
key id
키 id 서명
아니.
typ
Type
전체 jws 의 미디어 유형 을 가리 키 는 JOSE 는 compact, JOSE + JSON 은 json 을 의미한다.
아니.
cty
Content Type
부하 미디어 형식
아니.
crit
Critical
이 필드 에 열 거 된 확장 헤더 인 자 는 수신 자가 이해 하고 처리 해 야 합 니 다. 그렇지 않 으 면 이 jws 가 잘못 되 었 습 니 다. 이 필드 는 배열 형식 입 니 다.
아니.
x5u
X.509 URL
--
아니.
x5c
X.509 Certificate Chain
--
아니.
x5t
X.509 Certificate SHA-1 Thumbprint
--
아니.
x5t#S256
X.509 Certificate SHA-256 Thumbprint
--
아니.
# crit     
{
    "alg":"ES256",
    "crit":["exp","iss"],
    "exp":1363284000,
    "iss":"test"
}

다음은 rfc 7515 에서 제공 하 는 사례 로 HMAC 를 사용 합 니 다.SHA 256 은 JWS Signature 를 생 성 합 니 다.
1. 머리 는 줄 을 바 꾸 지 않 고 빈 칸 이 없 는 치밀 한 문자열 입 니 다.
Header = {"typ":"JWT","alg":"HS256"}
base64url(Header) = eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9
import base64
header_encoded = base64.urlsafe_b64encode(b'{"typ":"JWT","alg":"HS256"}')
print(header_encoded)

2. 하중 은 줄 바 꿈 과 빈 칸 을 포함 하 는 json 대상 으로 줄 바 꿈 에서 win 시스템 의 CRLF 를 가 져 옵 니 다. 또한 첫 줄 을 제외 하고 줄 마다 시작 에 빈 칸 이 있 고 줄 끝 에 빈 칸 이 없습니다.
Payload = {"iss":"joe",rn "exp":1300819380,rn "http://example.com/is_root":true}
base64url(Payload) = eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ
import base64
Payload = {"iss":"joe",\r
"exp":1300819380,\r
"http://example.com/is_root":true} payload_encoded = (b'{"iss":"joe",\r
"exp":1300819380,\r
"http://example.com/is_root":true}') print(payload_encoded)

3. Signature 생 성 시 머리 와 하중 을 하나 로 간주
Message = ASCII(BASE64URL(UTF8(JWS Protected Header)) || ’.’ || BASE64URL(JWS Payload))
HMAC_SHA 256 서명 시 대칭 적 인 밀 스푼 Key 를 사용 해 야 합 니 다. 여기 Key 는 미리 상의 한 것 입 니 다.
Key = AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow
Key 도 base64url 인 코딩 후의 내용 이기 때문에 Key 를 가 져 오 려 면 base64url 디 코딩 이 필요 합 니 다. 디 코딩 할 때 Key 의 길이 가 86, 86% 4 = 2 이기 때문에 '=' 을 추가 한 다음 디 코딩 해 야 합 니 다.
\ # 즉 디 코딩 할 때 사용 하 는 것 은 이것 입 니 다.
Key = AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow==
Signature = base64url( HMAC_SHA256(Message, Key) )
마지막 으로 dBjft JeZ4CVP - MB92K27uhBUJU1p1r 로 서명 받 았 습 니 다.wW1gFWFOEjXk=
import hashlib
import hmac
import base64

message = bytes('eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ','ascii')

secret = base64.urlsafe_b64decode('AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow==')

signature = base64.urlsafe_b64encode(hmac.new(secret, message, digestmod=hashlib.sha256).digest())

print(signature)

여분의 '=' 을 제거 하면 최종 Signature: dBjft JeZ4CVP - MB92K27uhBUJU1p1rwW1gFWFOEjXk
이렇게 해서 최종 JWS 는 (줄 을 바 꾸 는 것 은 보기 편 하도록 하 는 것 이 고 실제로는 한 줄 이다)
eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9
.
eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ
.
dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk
물론 실제 RSA 와 같은 알고리즘 을 사용 하여 서명 할 수 있 으 며 RFC 문서 의 사례 를 참고 할 수 있 습 니 다.
참고 문서: rfc 7515

좋은 웹페이지 즐겨찾기