JSON 웹 서명 규범 해석
여기 서 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Djoser로 인증Django 인증 시스템의 REST 구현. djoser 라이브러리는 Django Rest Framework 보기 세트를 제공하여 등록, 로그인, 로그아웃, 비밀번호 재설정 및 계정 활성화와 같은 기본 작업을 처리합니...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.