InternetEngineeringTaskForce(IETF)M.JonesRequestforComments:7515MicrosoftCategory:StandardsTrackJ.BradleyISSN:2070-1721PingIdentityN.SakimuraNRIMay2015InternetEngineeringTaskForce(IETF)M.JonesRequestforComments:7515MicrosoftCategory:StandardsTrackJ.BradleyISSN:2070-1721PingIdentityN.SakimuraNRIMay2015JSONWebSignature(JWS)
JSONWeb签名(JWS)
Abstract
摘要
JSONWebSignature(JWS)representscontentsecuredwithdigitalsignaturesorMessageAuthenticationCodes(MACs)usingJSON-baseddatastructures.CryptographicalgorithmsandidentifiersforusewiththisspecificationaredescribedintheseparateJSONWebAlgorithms(JWA)specificationandanIANAregistrydefinedbythatspecification.RelatedencryptioncapabilitiesaredescribedintheseparateJSONWebEncryption(JWE)specification.
StatusofThisMemo
关于下段备忘
ThisisanInternetStandardsTrackdocument.
这是一份互联网标准跟踪文件。
ThisdocumentisaproductoftheInternetEngineeringTaskForce(IETF).ItrepresentstheconsensusoftheIETFcommunity.IthasreceivedpublicreviewandhasbeenapprovedforpublicationbytheInternetEngineeringSteeringGroup(IESG).FurtherinformationonInternetStandardsisavailableinSection2ofRFC5741.
本文件是互联网工程任务组(IETF)的产品。它代表了IETF社区的共识。它已经接受了公众审查,并已被互联网工程指导小组(IESG)批准出版。有关互联网标准的更多信息,请参见RFC5741第2节。
TableofContents
目录
JSONWeb签名(JWS)表示使用基于JSON的[RFC7159]数据结构的数字签名或消息身份验证码(MAC)保护的内容。JWS加密机制为任意八位字节序列提供完整性保护。有关数字签名和MAC之间差异的讨论,请参见第10.5节。
TwocloselyrelatedserializationsforJWSsaredefined.TheJWSCompactSerializationisacompact,URL-saferepresentationintendedforspace-constrainedenvironmentssuchasHTTPAuthorizationheadersandURIqueryparameters.TheJWSJSONSerializationrepresentsJWSsasJSONobjectsandenablesmultiplesignaturesand/orMACstobeappliedtothesamecontent.Bothsharethesamecryptographicunderpinnings.
CryptographicalgorithmsandidentifiersforusewiththisspecificationaredescribedintheseparateJSONWebAlgorithms(JWA)[JWA]specificationandanIANAregistrydefinedbythatspecification.RelatedencryptioncapabilitiesaredescribedintheseparateJSONWebEncryption(JWE)[JWE]specification.
Namesdefinedbythisspecificationareshortbecauseacoregoalisfortheresultingrepresentationstobecompact.
本规范定义的名称很短,因为核心目标是使结果表示紧凑。
本文件中的关键词“必须”、“不得”、“要求”、“应”、“不得”、“应”、“不应”、“建议”、“不建议”、“可”和“可选”应按照“RFC中用于表示要求水平的关键词”[RFC2119]中的描述进行解释。该解释仅适用于所有大写字母的术语。
BASE64URL(OCTETS)denotesthebase64urlencodingofOCTETS,perSection2.
根据第2节,BASE64URL(八位字节)表示八位字节的BASE64URL编码。
UTF8(STRING)denotestheoctetsoftheUTF-8[RFC3629]representationofSTRING,whereSTRINGisasequenceofzeroormoreUnicode[UNICODE]characters.
UTF8(字符串)表示字符串的UTF-8[RFC3629]表示形式的八位字节,其中字符串是零个或多个Unicode[Unicode]字符的序列。
ASCII(STRING)denotestheoctetsoftheASCII[RFC20]representationofSTRING,whereSTRINGisasequenceofzeroormoreASCIIcharacters.
ASCII(字符串)表示字符串的ASCII[RFC20]表示的八位字节,其中字符串是零个或多个ASCII字符的序列。
TheconcatenationoftwovaluesAandBisdenotedasA||B.
两个值A和B的串联表示为A||B。
Thesetermsaredefinedbythisspecification:
这些术语由本规范定义:
JSONWebSignature(JWS)AdatastructurerepresentingadigitallysignedorMACedmessage.
JSONWeb签名(JWS)表示数字签名或MACE消息的数据结构。
JOSEHeaderJSONobjectcontainingtheparametersdescribingthecryptographicoperationsandparametersemployed.TheJOSE(JSONObjectSigningandEncryption)HeaderiscomprisedofasetofHeaderParameters.
JOSEHeaderJSON对象,包含描述加密操作和所用参数的参数。JOSE(JSON对象签名和加密)头由一组头参数组成。
JWSPayloadThesequenceofoctetstobesecured--a.k.a.themessage.Thepayloadcancontainanarbitrarysequenceofoctets.
JWS有效负载要保护的八位字节序列——也称为消息。有效载荷可以包含任意八位字节序列。
JWSSignatureDigitalsignatureorMACovertheJWSProtectedHeaderandtheJWSPayload.
JWS签名通过JWS保护的报头和JWS有效负载的数字签名或MAC。
HeaderParameterAname/valuepairthatismemberoftheJOSEHeader.
Header参数作为JOSE头成员的名称/值对。
JWSProtectedHeaderJSONobjectthatcontainstheHeaderParametersthatareintegrityprotectedbytheJWSSignaturedigitalsignatureorMACoperation.FortheJWSCompactSerialization,thiscomprisestheentireJOSEHeader.FortheJWSJSONSerialization,thisisonecomponentoftheJOSEHeader.
JWS-ProtectedHeaderJSON对象,其中包含受JWS签名数字签名或MAC操作完整性保护的头参数。对于JWS紧凑序列化,这包括整个JOSE头。对于JWS-JSON序列化,这是JOSE头的一个组件。
JWSUnprotectedHeaderJSONobjectthatcontainstheHeaderParametersthatarenotintegrityprotected.ThiscanonlybepresentwhenusingtheJWSJSONSerialization.
JWSUnprotectedHeaderJSON对象,其中包含不受完整性保护的头参数。这只能在使用JWSJSON序列化时出现。
Base64url编码使用RFC4648[RFC4648]第5节中定义的URL和文件名安全字符集进行Base64编码,省略所有尾随“=”字符(如第3.2节所允许),且不包含任何换行符、空白或其他附加字符。请注意,空八位字节序列的base64url编码是空字符串。(有关实现无填充的base64url编码的说明,请参见附录C。)
JWSCompactSerializationArepresentationoftheJWSasacompact,URL-safestring.
JWS紧凑序列化将JWS表示为紧凑的URL安全字符串。
JWSJSONSerializationArepresentationoftheJWSasaJSONobject.UnliketheJWSCompactSerialization,theJWSJSONSerializationenablesmultipledigitalsignaturesand/orMACstobeappliedtothesamecontent.ThisrepresentationisneitheroptimizedforcompactnessnorURL-safe.
JWSJSON序列化将JWS表示为JSON对象。与JWS紧凑序列化不同,JWSJSON序列化允许对同一内容应用多个数字签名和/或MAC。此表示既不优化紧凑性,也不优化URL安全性。
不安全JWS不提供完整性保护的JWS。不安全的JWS使用“alg”值“none”。
Collision-ResistantNameAnameinanamespacethatenablesnamestobeallocatedinamannersuchthattheyarehighlyunlikelytocollidewithothernames.Examplesofcollision-resistantnamespacesinclude:DomainNames,ObjectIdentifiers(OIDs)asdefinedintheITU-TX.660andX.670Recommendationseries,andUniversallyUniqueIDentifiers(UUIDs)[RFC4122].Whenusinganadministrativelydelegatednamespace,thedefinerofanameneedstotakereasonableprecautionstoensuretheyareincontroloftheportionofthenamespacetheyusetodefinethename.
抗冲突名称命名空间中的名称,该名称允许以不太可能与其他名称冲突的方式分配名称。抗冲突名称空间的示例包括:域名、ITU-TX.660和X.670建议系列中定义的对象标识符(OID)以及通用唯一标识符(UUID)[RFC4122]。当使用管理委派的命名空间时,名称的定义者需要采取合理的预防措施,以确保他们能够控制用于定义名称的命名空间部分。
StringOrURI是一个JSON字符串值,另外还要求,尽管可以使用任意字符串值,但包含“:”字符的任何值都必须是URI[RFC3986]。StringOrURI值作为区分大小写的字符串进行比较,不应用任何转换或规范化。
术语“JSONWeb加密(JWE)”、“JWE压缩序列化”和“JWEJSON序列化”由JWE规范[JWE]定义。
术语“数字签名”和“消息认证码(MAC)”由“互联网安全词汇表,第2版”[RFC4949]定义。
JWSrepresentsdigitallysignedorMACedcontentusingJSONdatastructuresandbase64urlencoding.TheseJSONdatastructuresMAYcontainwhitespaceand/orlinebreaksbeforeorafteranyJSONvaluesorstructuralcharacters,inaccordancewithSection2ofRFC7159[RFC7159].AJWSrepresentstheselogicalvalues(eachofwhichisdefinedinSection2):
JWS使用JSON数据结构和base64url编码表示数字签名或标记的内容。根据RFC7159[RFC7159]第2节的规定,这些JSON数据结构可能在任何JSON值或结构字符之前或之后包含空格和/或换行符。JWS表示这些逻辑值(每个逻辑值在第2节中定义):
oJOSEHeaderoJWSPayloadoJWSSignature
o何塞头oJWS有效载荷oJWS签名
ForaJWS,theJOSEHeadermembersaretheunionofthemembersofthesevalues(eachofwhichisdefinedinSection2):
对于JWS,JOSE头成员是这些值的成员的并集(每个值在第2节中定义):
oJWSProtectedHeaderoJWSUnprotectedHeader
oJWS受保护的头文件到JWS未受保护的头文件
ThisdocumentdefinestwoserializationsforJWSs:acompact,URL-safeserializationcalledtheJWSCompactSerializationandaJSONserializationcalledtheJWSJSONSerialization.Inbothserializations,theJWSProtectedHeader,JWSPayload,andJWSSignaturearebase64urlencoded,sinceJSONlacksawaytodirectlyrepresentarbitraryoctetsequences.
本文档为JWSs定义了两种序列化:一种称为JWS紧凑序列化的紧凑的URL安全序列化和一种称为JWSJSON序列化的JSON序列化。在这两种序列化中,JWS-Protected头、JWS-Payload和JWS-Signature都是base64url编码的,因为JSON无法直接表示任意八位字节序列。
IntheJWSCompactSerialization,noJWSUnprotectedHeaderisused.Inthiscase,theJOSEHeaderandtheJWSProtectedHeaderarethesame.
在JWS紧凑序列化中,不使用JWS未受保护的头。在这种情况下,JOSE头和JWS-Protected头是相同的。
IntheJWSCompactSerialization,aJWSisrepresentedastheconcatenation:
在JWS紧凑序列化中,JWS表示为串联:
SeeSection7.1formoreinformationabouttheJWSCompactSerialization.
有关JWS紧凑序列化的更多信息,请参见第7.1节。
IntheJWSJSONSerialization,oneorbothoftheJWSProtectedHeaderandJWSUnprotectedHeaderMUSTbepresent.Inthiscase,themembersoftheJOSEHeaderaretheunionofthemembersoftheJWSProtectedHeaderandtheJWSUnprotectedHeadervaluesthatarepresent.
在JWSJSON序列化中,必须存在JWS受保护的头和JWS未受保护的头中的一个或两个。在这种情况下,JOSE头的成员是存在的JWS保护头和JWS未保护头值的成员的并集。
IntheJWSJSONSerialization,aJWSisrepresentedasaJSONobjectcontainingsomeorallofthesefourmembers:
在JWSJSON序列化中,JWS被表示为包含以下四个成员中的一部分或全部的JSON对象:
三个base64url编码的结果字符串和JWSUnprotected头值表示为JSON对象中的成员。包含其中一些值是可选的。JWSJSON序列化还可以表示多个签名和/或MAC值,而不仅仅是一个。有关JWSJSON序列化的更多信息,请参见第7.2节。
ThissectionprovidesanexampleofaJWS.ItscomputationisdescribedinmoredetailinAppendixA.1,includingspecifyingtheexactoctetsequencesrepresentingtheJSONvaluesusedandthekeyvalueused.
本节提供了一个JWS的示例。其计算在附录A.1中有更详细的描述,包括指定表示所用JSON值和所用键值的精确八位字节序列。
ThefollowingexampleJWSProtectedHeaderdeclaresthattheencodedobjectisaJSONWebToken[JWT]andtheJWSProtectedHeaderandtheJWSPayloadaresecuredusingtheHMACSHA-256[RFC2104][SHS]algorithm:
将此受JWS保护的标头编码为BASE64URL(UTF8(受JWS保护的标头))将给出以下值:
eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9TheUTF-8representationofthefollowingJSONobjectisusedastheJWSPayload.(NotethatthepayloadcanbeanycontentandneednotbearepresentationofaJSONobject.)
以下JSON对象的UTF-8表示用作JWS负载。(请注意,有效负载可以是任何内容,而不必是JSON对象的表示。)
将此JWS有效负载编码为BASE64URL(JWS有效负载)将给出此值(换行符仅用于显示目的):
eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ
EYJPC3MIOIJQB2UILA0KIJLEHAIOJEZMDA4MTKZODAQIMH0DHA6LY9LEGFTcGxlLmNvbS9pc19yb290Ijp0cnVlfQ
dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk
eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ.dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk
eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9。EYJPC3MIOIJQB2UILA0KIJLEHAIOJEZMDA4MTKZODAZODAQIMH0DHA6LY9LEGFTcGxlLmNvbS9pc19yb290Ijp0cnVlfQ。dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk
SeeAppendixAforadditionalexamples,includingexamplesusingtheJWSJSONSerializationinSectionsA.6andA.7.
更多示例请参见附录A,包括第A.6和A.7节中使用JWSJSON序列化的示例。
对于JWS,表示JOSE头的JSON对象的成员描述了应用于JWS保护头的数字签名或MAC、JWS有效负载以及JWS的可选附加属性。JOSE头中的头参数名称必须是唯一的;JWS解析器必须拒绝具有重复头参数名称的JWSs,或者使用只返回词汇上最后一个重复成员名称的JSON解析器,如ECMAScript5.1[ECMAScript]第15.12节(“JSON对象”)所述。
实现需要理解本规范定义的指定为“必须理解”的特定头参数,并以本规范中定义的方式处理它们。此文件定义的所有其他标题参数
specificationthatarenotsodesignatedMUSTbeignoredwhennotunderstood.UnlesslistedasacriticalHeaderParameter,perSection4.1.11,allHeaderParametersnotdefinedbythisspecificationMUSTbeignoredwhennotunderstood.
未指定的规范在不理解时必须忽略。根据第4.1.11节,除非列为关键标题参数,否则本规范未定义的所有标题参数在不理解时必须忽略。
TherearethreeclassesofHeaderParameternames:RegisteredHeaderParameternames,PublicHeaderParameternames,andPrivateHeaderParameternames.
有三类头参数名称:注册头参数名称、公共头参数名称和私有头参数名称。
JWSs中使用的以下标题参数名称在第9.1节建立的IANA“JSONWeb签名和加密标题参数”注册表中注册,其含义如下小节所述。
Asindicatedbythecommonregistry,JWSsandJWEsshareacommonHeaderParameterspace;whenaparameterisusedbybothspecifications,itsusagemustbecompatiblebetweenthespecifications.
如公共注册表所示,JWSs和JWEs共享一个公共头参数空间;当一个参数由两个规范使用时,其用法必须在两个规范之间兼容。
“alg”(algorithm)头参数标识用于保护JWS的加密算法。如果“alg”值不表示受支持的算法,或者如果没有与该算法一起使用的密钥与对内容进行数字签名或标记的一方关联,则JWS签名值无效。“alg”值应该在[JWA]建立的IANA“JSONWeb签名和加密算法”注册表中注册,或者是包含防冲突名称的值。“alg”值是一个区分大小写的ASCII字符串,包含StringOrURI值。此头参数必须存在,并且必须被实现理解和处理。
可在[JWA]建立的IANA“JSONWeb签名和加密算法”注册表中找到此用途定义的“alg”值列表;本注册表的初始内容为[JWA]第3.1节中定义的值。
“jku”(JWKSetURL)头参数是一个URI[RFC3986],它引用一组JSON编码公钥的资源,其中一个公钥对应于用于对JWS进行数字签名的密钥。密钥必须编码为JWK集[JWK]。用于获取资源的协议必须提供完整性保护;检索JWK集的HTTPGET请求必须使用传输层安全性
(TLS)[RFC2818][RFC5246];andtheidentityoftheserverMUSTbevalidated,asperSection6ofRFC6125[RFC6125].Also,seeSection8onTLSrequirements.UseofthisHeaderParameterisOPTIONAL.
(TLS)[RFC2818][RFC5246];根据RFC6125[RFC6125]第6节,必须验证服务器的身份。此外,参见第8节TLS要求。此标头参数的使用是可选的。
“jwk”(JSONWeb密钥)头参数是与用于对JWS进行数字签名的密钥相对应的公钥。此密钥表示为JSONWeb密钥[JWK]。此标头参数的使用是可选的。
“kid”(keyID)头参数是一个提示,指示用于保护JWS的密钥。此参数允许发起者向收件人明确发出密钥更改的信号。未指定“kid”值的结构。其值必须是区分大小写的字符串。此标头参数的使用是可选的。
与JWK一起使用时,“kid”值用于匹配JWK“kid”参数值。
“x5u”(X.509URL)头参数是一个URI[RFC3986],它引用与用于对JWS进行数字签名的密钥相对应的X.509公钥证书或证书链[RFC5280]的资源。标识的资源必须以PEM编码形式提供符合RFC5280[RFC5280]的证书或证书链的表示,每个证书按照RFC4945[RFC4945]第6.1节的规定进行分隔。包含与用于对JWS进行数字签名的密钥相对应的公钥的证书必须是第一个证书。随后可能会有其他证书,每个后续证书都是用于认证前一个证书的证书。用于获取资源的协议必须提供完整性保护;检索证书的HTTPGET请求必须使用TLS[RFC2818][RFC5246];根据RFC6125[RFC6125]第6节,必须验证服务器的身份。此外,参见第8节TLS要求。此标头参数的使用是可选的。
“x5c”(X.509证书链)头参数包含与用于对JWS进行数字签名的密钥相对应的X.509公钥证书或证书链[RFC5280]。证书或证书链表示为
certificatevaluestrings.Eachstringinthearrayisabase64-encoded(Section4of[RFC4648]--notbase64url-encoded)DER[ITU.X690.2008]PKIXcertificatevalue.ThecertificatecontainingthepublickeycorrespondingtothekeyusedtodigitallysigntheJWSMUSTbethefirstcertificate.ThisMAYbefollowedbyadditionalcertificates,witheachsubsequentcertificatebeingtheoneusedtocertifythepreviousone.TherecipientMUSTvalidatethecertificatechainaccordingtoRFC5280[RFC5280]andconsiderthecertificateorcertificatechaintobeinvalidifanyvalidationfailureoccurs.UseofthisHeaderParameterisOPTIONAL.
证书值字符串。数组中的每个字符串都是[ITU.X690.2008]PKIX证书值下的base64编码(RFC4648的第4节——非base64url编码)。包含与用于对JWS进行数字签名的密钥相对应的公钥的证书必须是第一个证书。随后可能会有其他证书,每个后续证书都是用于认证前一个证书的证书。接收方必须根据RFC5280[RFC5280]验证证书链,并且如果发生任何验证失败,则认为证书或证书链无效。此标头参数的使用是可选的。
有关“x5c”值的示例,请参见附录B。
“x5t”(X.509证书SHA-1指纹)头参数是X.509证书[RFC5280]的DER编码的base64url编码SHA-1指纹(也称为摘要),对应于用于对JWS进行数字签名的密钥。请注意,证书指纹有时也称为证书指纹。此标头参数的使用是可选的。
4.1.8.“x5t#S256”(X.509证书SHA-256指纹)标题参数
“x5t#S256”(X.509证书SHA-256指纹)头参数是X.509证书[RFC5280]的DER编码的base64url编码SHA-256指纹(也称为摘要),对应于用于对JWS进行数字签名的密钥。请注意,证书指纹有时也称为证书指纹。此标头参数的使用是可选的。
PerRFC2045[RFC2045],allmediatypevalues,subtypevalues,andparameternamesarecaseinsensitive.However,parametervaluesarecasesensitiveunlessotherwisespecifiedforthespecificparameter.
根据RFC2045[RFC2045],所有媒体类型值、子类型值和参数名称都不区分大小写。但是,除非为特定参数另行指定,否则参数值区分大小写。
为了在常见情况下保持消息紧凑,建议生产者在“typ”头参数中省略媒体类型值的“application/”前缀,前提是媒体类型值中没有其他“/”出现。使用媒体类型值的收件人必须将其视为“application/”前置于任何不包含“/”的“typ”值。例如,“示例”的“typ”值应用于表示“应用程序/示例”媒体类型,而媒体类型“应用程序/示例;part=“1/2”不能缩短为“示例;part=“1/2”。
应用程序可以使用“typ”值“JOSE”来指示此对象是使用JWS紧凑序列化或JWE紧凑序列化的JWS或JWE。应用程序可以使用“typ”值“JOSE+JSON”来指示此对象是使用JWS-JSON序列化或JWE-JSON序列化的JWS或JWE。应用程序也可以使用其他类型值。
为了在常见情况下保持消息的紧凑性,建议生产者在“cty”头参数中省略媒体类型值的“application/”前缀,前提是媒体类型值中没有其他“/”出现。使用媒体类型值的收件人必须将其视为“application/”前置于任何不包含“/”的“cty”值。例如,应使用“示例”的“cty”值表示“应用程序/示例”媒体类型,而媒体类型“应用程序/示例;part=“1/2”不能缩短为“示例;part=“1/2”。
“crit”(critical)头参数表示正在使用本规范和/或[JWA]的扩展,必须理解和处理这些扩展。它的值是一个数组,列出使用这些扩展名的JOSE头中存在的头参数名称。如果收件人不理解和支持列出的任何扩展标头参数,则JWS无效。生产者不得在“crit”列表中包含本规范或[JWA]定义的用于JWS的标题参数名称、重复名称或不作为JOSE标题中的标题参数名称出现的名称。生产者不得使用空列表“[]”作为“临界值”。如果关键列表包含由本规范定义的任何头参数名或JWS与JWS一起使用,或者如果对其使用的任何其他约束被违反,则接收方可能认为JWS无效。使用时,此标头参数必须受完整性保护;因此,它必须只出现在JWS保护的头中。此标头参数的使用是可选的。实现必须理解和处理此头参数。
{“alg”:“ES256”,“crit”:[“exp”],“exp”:1363284000}
使用JWSs的人可以定义其他头参数名称。但是,为了防止冲突,任何新的头参数名称都应该在第9.1节建立的IANA“JSONWeb签名和加密头参数”注册表中注册,或者是一个公共名称(一个包含抗冲突名称的值)。在每种情况下,名称或值的定义者都需要采取合理的预防措施,以确保他们能够控制用于定义头参数名称的命名空间部分。
NewHeaderParametersshouldbeintroducedsparingly,astheycanresultinnon-interoperableJWSs.
应该谨慎地引入新的头参数,因为它们可能导致不可互操作的JWS。
AproducerandconsumerofaJWSmayagreetouseHeaderParameternamesthatarePrivateNames(namesthatarenotRegisteredHeaderParameternames(Section4.1))orPublicHeaderParameternames
JWS的生产者和消费者可能同意使用私有名称(未注册的头参数名称(第4.1节))或公共头参数名称的头参数名称
(Section4.2).UnlikePublicHeaderParameternames,PrivateHeaderParameternamesaresubjecttocollisionandshouldbeusedwithcaution.
(第4.2节)。与公共标头参数名称不同,私有标头参数名称会发生冲突,应谨慎使用。
TocreateaJWS,thefollowingstepsareperformed.Theorderofthestepsisnotsignificantincaseswheretherearenodependenciesbetweentheinputsandoutputsofthesteps.
要创建JWS,请执行以下步骤。在步骤的输入和输出之间没有依赖关系的情况下,步骤的顺序并不重要。
1.CreatethecontenttobeusedastheJWSPayload.
1.创建要用作JWS负载的内容。
2.ComputetheencodedpayloadvalueBASE64URL(JWSPayload).
2.计算编码的有效负载值BASE64URL(JWS有效负载)。
3.CreatetheJSONobject(s)containingthedesiredsetofHeaderParameters,whichtogethercomprisetheJOSEHeader(theJWSProtectedHeaderand/ortheJWSUnprotectedHeader).
3.创建包含所需的一组头参数的JSON对象,这些头参数共同构成JOSE头(JWS保护头和/或JWS未保护头)。
4.计算编码的头值BASE64URL(UTF8(JWS保护头))。如果JWS-Protected头不存在(这只能在使用JWS-JSON序列化且不存在“Protected”成员时发生),则将该值设为空字符串。
6.ComputetheencodedsignaturevalueBASE64URL(JWSSignature).
6.计算编码的签名值BASE64URL(JWS签名)。
7.IftheJWSJSONSerializationisbeingused,repeatthisprocess(steps3-6)foreachdigitalsignatureorMACoperationbeingperformed.
7.如果正在使用JWSJSON序列化,则对执行的每个数字签名或MAC操作重复此过程(步骤3-6)。
WhenvalidatingaJWS,thefollowingstepsareperformed.Theorderofthestepsisnotsignificantincaseswheretherearenodependenciesbetweentheinputsandoutputsofthesteps.Ifanyofthelistedstepsfails,thenthesignatureorMACcannotbevalidated.
验证JWS时,将执行以下步骤。在步骤的输入和输出之间没有依赖关系的情况下,步骤的顺序并不重要。如果列出的任何步骤失败,则无法验证签名或MAC。
WhentherearemultipleJWSSignaturevalues,itisanapplicationdecisionwhichoftheJWSSignaturevaluesmustsuccessfullyvalidatefortheJWStobeaccepted.Insomecases,allmustsuccessfullyvalidate,ortheJWSwillbeconsideredinvalid.Inothercases,onlyaspecificJWSSignaturevalueneedstobesuccessfullyvalidated.However,inallcases,atleastoneJWSSignaturevalueMUSTsuccessfullyvalidate,ortheJWSMUSTbeconsideredinvalid.
当存在多个JWS签名值时,应用程序决定必须成功验证哪个JWS签名值才能接受JWS。在某些情况下,必须成功验证所有JWS,否则JWS将被视为无效。在其他情况下,只需要成功验证特定的JWS签名值。但是,在所有情况下,至少必须成功验证一个JWS签名值,否则JWS必须被视为无效。
2.Base64url-decodetheencodedrepresentationoftheJWSProtectedHeader,followingtherestrictionthatnolinebreaks,whitespace,orotheradditionalcharactershavebeenused.
2.Base64url解码受JWS保护的标头的编码表示形式,并遵循未使用换行符、空格或其他附加字符的限制。
3.VerifythattheresultingoctetsequenceisaUTF-8-encodedrepresentationofacompletelyvalidJSONobjectconformingtoRFC7159[RFC7159];lettheJWSProtectedHeaderbethisJSONobject.
3.验证生成的八位字节序列是符合RFC7159[RFC7159]的完全有效JSON对象的UTF-8编码表示;让JWS受保护的头是这个JSON对象。
4.IfusingtheJWSCompactSerialization,lettheJOSEHeaderbetheJWSProtectedHeader.Otherwise,whenusingtheJWSJSONSerialization,lettheJOSEHeaderbetheunionofthemembersofthecorrespondingJWSProtectedHeaderandJWSUnprotectedHeader,allofwhichmustbecompletelyvalidJSONobjects.Duringthisstep,verifythattheresultingJOSEHeaderdoesnotcontainduplicateHeaderParameternames.WhenusingtheJWS
4.如果使用JWS紧凑序列化,则让JOSE头成为JWS保护头。否则,在使用JWSJSON序列化时,让JOSE头成为相应JWS受保护头和JWS未受保护头的成员的并集,所有这些头都必须是完全有效的JSON对象。在此步骤中,验证生成的JOSE标头不包含重复的标头参数名称。使用JWS时
JSONSerialization,thisrestrictionincludesthatthesameHeaderParameternamealsoMUSTNOToccurindistinctJSONobjectvaluesthattogethercomprisetheJOSEHeader.
JSON序列化,此限制包括相同的头参数名称也不得出现在共同构成JOSE头的不同JSON对象值中。
5.验证实现是否理解并能够处理其需要支持的所有字段,无论是本规范、所用算法还是“crit”头参数值要求的字段,以及这些参数的值是否也被理解和支持。
6.Base64url-decodetheencodedrepresentationoftheJWSPayload,followingtherestrictionthatnolinebreaks,whitespace,orotheradditionalcharactershavebeenused.
6.Base64url对JWS有效负载的编码表示进行解码,并遵循未使用换行符、空格或其他附加字符的限制。
7.Base64url-decodetheencodedrepresentationoftheJWSSignature,followingtherestrictionthatnolinebreaks,whitespace,orotheradditionalcharactershavebeenused.
7.Base64url对JWS签名的编码表示形式进行解码,并遵守未使用换行符、空格或其他附加字符的限制。
9.IftheJWSJSONSerializationisbeingused,repeatthisprocess(steps4-8)foreachdigitalsignatureorMACvaluecontainedintherepresentation.
9.如果正在使用JWSJSON序列化,请对表示中包含的每个数字签名或MAC值重复此过程(步骤4-8)。
10.Ifnoneofthevalidationsinstep9succeeded,thentheJWSMUSTbeconsideredinvalid.Otherwise,intheJWSJSONSerializationcase,returnaresulttotheapplicationindicatingwhichofthevalidationssucceededandfailed.IntheJWSCompactSerializationcase,theresultcansimplyindicatewhetherornottheJWSwassuccessfullyvalidated.
10.如果步骤9中的验证均未成功,则必须将JWS视为无效。否则,在JWSJSON序列化案例中,向应用程序返回一个结果,指示哪些验证成功,哪些验证失败。在JWS紧凑序列化案例中,结果可以简单地指示JWS是否已成功验证。
Finally,notethatitisanapplicationdecisionwhichalgorithmsmaybeusedinagivencontext.EvenifaJWScanbesuccessfullyvalidated,unlessthealgorithm(s)usedintheJWSareacceptabletotheapplication,itSHOULDconsidertheJWStobeinvalid.
最后,请注意,在给定上下文中可以使用哪些算法是应用程序的决定。即使JWS可以被成功地验证,除非JWS中使用的算法对应用程序是可接受的,否则它应该考虑JWS无效。
处理JWS不可避免地需要将已知字符串与JSON对象中的成员和值进行比较。例如,在检查算法时,将对照JOSE头中的成员名称检查Unicode字符串“alg”,以查看是否存在匹配
标题参数名称。然后使用相同的过程确定“alg”头参数的值是否表示支持的算法。
TheJSONrulesfordoingmembernamecomparisonaredescribedinSection8.3ofRFC7159[RFC7159].Sincetheonlystringcomparisonoperationsthatareperformedareequalityandinequality,thesamerulescanbeusedforcomparingbothmembernamesandmembervaluesagainstknownstrings.
RFC7159[RFC7159]第8.3节描述了用于进行成员名称比较的JSON规则。由于执行的唯一字符串比较操作是相等和不相等,因此可以使用相同的规则将成员名称和成员值与已知字符串进行比较。
这些比较规则必须用于所有JSON字符串比较,除非该成员的定义明确要求对该成员值使用不同的比较规则。只有本规范中定义的“typ”和“cty”成员值不使用这些比较规则。
一些应用程序可能在区分大小写的值中包含不区分大小写的信息,例如将DNS名称作为“kid”(密钥ID)值的一部分。在这些情况下,如果多个参与方可能需要生成相同的值以便可以对它们进行比较,则应用程序可能需要定义规范大小写用于表示不区分大小写的部分的约定,例如将它们小写。(但是,如果所有其他方使用制作方逐字发出的任何值,而不尝试将其与独立制作的值进行比较,则制作方使用的案例将不重要。)
Also,seetheJSONsecurityconsiderationsinSection10.12andtheUnicodesecurityconsiderationsinSection10.13.
另外,请参阅第10.12节中的JSON安全注意事项和第10.13节中的Unicode安全注意事项。
JWS的接收者必须能够确定用于数字签名或MAC操作的密钥。使用的键可以使用第4.1节中描述的标题参数方法识别,也可以使用本规范范围之外的方法识别。具体而言,头参数“jku”、“jwk”、“kid”、“x5u”、“x5c”、“x5t”和“x5t#S256”可用于识别所使用的密钥。如果要在信任决策中使用这些头参数所传递的信息,则必须对其进行完整性保护;但是,如果信任决策中使用的唯一信息是密钥,则不需要对这些参数进行完整性保护,因为以导致使用不同密钥的方式更改这些参数将导致验证失败。
TheproducerSHOULDincludesufficientinformationintheHeaderParameterstoidentifythekeyused,unlesstheapplicationusesanothermeansorconventiontodeterminethekeyused.Validationof
生产者应在标题参数中包含足够的信息,以识别所使用的密钥,除非应用程序使用其他方法或约定来确定所使用的密钥。验证
当所使用的算法需要密钥(除“无”之外的所有算法都是如此)且无法确定所使用的密钥时,签名或MAC失败。
Themeansofexchanginganysharedsymmetrickeysusedisoutsidethescopeofthisspecification.
交换使用的任何共享对称密钥的方法不在本规范的范围内。
Also,seeAppendixDfornotesonpossiblekeyselectionalgorithms.
此外,有关可能的密钥选择算法的说明,请参见附录D。
JWSsuseoneoftwoserializations:theJWSCompactSerializationortheJWSJSONSerialization.Applicationsusingthisspecificationneedtospecifywhatserializationandserializationfeaturesareusedforthatapplication.Forinstance,applicationsmightspecifythatonlytheJWSJSONSerializationisused,thatonlyJWSJSONSerializationsupportforasinglesignatureorMACvalueisused,orthatsupportformultiplesignaturesand/orMACvaluesisused.JWSimplementationsonlyneedtoimplementthefeaturesneededfortheapplicationstheyaredesignedtosupport.
JWS使用两种序列化之一:JWS紧凑序列化或JWSJSON序列化。使用此规范的应用程序需要指定该应用程序使用的序列化和序列化功能。例如,应用程序可能指定只使用JWSJSON序列化,只使用对单个签名或MAC值的JWSJSON序列化支持,或者使用对多个签名和/或MAC值的支持。JWS实现只需要实现其设计支持的应用程序所需的功能。
TheJWSCompactSerializationrepresentsdigitallysignedorMACedcontentasacompact,URL-safestring.Thisstringis:
JWS紧凑序列化将数字签名或标记的内容表示为紧凑的URL安全字符串。此字符串是:
Onlyonesignature/MACissupportedbytheJWSCompactSerializationanditprovidesnosyntaxtorepresentaJWSUnprotectedHeadervalue.
JWS紧凑序列化只支持一个签名/MAC,并且它不提供语法来表示JWS未受保护的头值。
TheJWSJSONSerializationrepresentsdigitallysignedorMACedcontentasaJSONobject.ThisrepresentationisneitheroptimizedforcompactnessnorURL-safe.
JWSJSON序列化将数字签名或标记的内容表示为JSON对象。此表示既不优化紧凑性,也不优化URL安全性。
TwocloselyrelatedsyntaxesaredefinedfortheJWSJSONSerialization:afullygeneralsyntax,withwhichcontentcanbesecuredwithmorethanonedigitalsignatureand/orMACoperation,andaflattenedsyntax,whichisoptimizedforthesingledigitalsignatureorMACcase.
Thefollowingmembersaredefinedforuseintop-levelJSONobjectsusedforthefullygeneralJWSJSONSerializationsyntax:
定义了以下成员,以便在用于完全通用JWSJSON序列化语法的顶级JSON对象中使用:
payload“payload”成员必须存在并包含值BASE64URL(JWSpayload)。
签名“signatures”成员值必须是JSON对象的数组。每个对象表示JWS有效负载和JWS保护头上的签名或MAC。
定义了以下成员,以便在作为“签名”数组元素的JSON对象中使用:
受保护当JWS受保护标头值为非空时,“受保护”成员必须存在并包含值BASE64URL(UTF8(JWS受保护标头));否则,它必须缺席。这些标头参数值受完整性保护。
header当JWSUnprotectedheader值为非空时,“header”成员必须存在并包含值JWSUnprotectedheader;否则,它必须缺席。此值表示为未编码的JSON对象,而不是字符串。这些标头参数值不受完整性保护。
签名“签名”成员必须存在并包含值BASE64URL(JWS签名)。
每个签名/MAC计算必须至少存在一个“受保护”和“报头”成员,以便传递“alg”报头参数值。
AdditionalmemberscanbepresentinboththeJSONobjectsdefinedabove;ifnotunderstoodbyimplementationsencounteringthem,theyMUSTbeignored.
在上面定义的两个JSON对象中都可以存在其他成员;如果遇到它们的实现无法理解它们,则必须忽略它们。
创建或验证单个签名或MAC值时使用的头参数值是可能存在的两组头参数值的并集:(1)签名/MAC数组元素的“受保护”成员中表示的JWS受保护头,以及(2)“头”中表示的JWS未受保护头
签名/MAC的数组元素的成员。这些标头参数集的并集包括JOSE标头。两个位置中的标头参数名称必须不相交。
每个JWS签名值都是使用相应JOSE头值的参数以与JWS紧凑序列化相同的方式计算的。这有一个可取的特性,即“signatures”数组中表示的每个JWS签名值与JWS紧凑序列化中为同一参数计算的值相同,前提是该签名/MAC计算的JWS保护头值(表示完整性保护的头参数值)与JWS紧凑序列化中使用的匹配。
Insummary,thesyntaxofaJWSusingthegeneralJWSJSONSerializationisasfollows:
总之,使用通用JWSJSON序列化的JWS的语法如下:
有关使用通用JWSJSON序列化语法的JWS示例,请参见附录A.6。
扁平化JWSJSON序列化语法基于通用语法,但对其进行了扁平化,针对单个数字签名/MAC情况对其进行了优化。它通过删除“signatures”成员,将定义用于“signatures”数组的成员(“protected”、“header”和“signature”成员)放在顶级JSON对象(与“payload”成员处于同一级别)中,从而将其展平。
使用此语法时,“签名”成员不得出现。除了这种语法差异之外,使用平坦语法的JWSJSON序列化对象的处理方式与使用常规语法的JWSJSON序列化对象的处理方式相同。
Insummary,thesyntaxofaJWSusingtheflattenedJWSJSONSerializationisasfollows:
总之,使用扁平化JWSJSON序列化的JWS的语法如下:
有关使用扁平化JWSJSON序列化语法的JWS示例,请参见附录A.7。
为了防止信息泄露和篡改,必须使用TLS和提供机密性和完整性保护的密码套件应用机密性保护。参见IETFTLS工作组的最新出版物,包括RFC6176[RFC6176],了解目前认为适合使用的密码套件指南。此外,请参阅“安全使用传输层安全性(TLS)和数据报传输层安全性(DTLS)的建议”[RFC7525],了解使用TLS改进软件和服务安全性的建议。
WheneverTLSisused,theidentityoftheserviceproviderencodedintheTLSservercertificateMUSTbeverifiedusingtheproceduresdescribedinSection6ofRFC6125[RFC6125].
无论何时使用TLS,必须使用RFC6125[RFC6125]第6节中描述的程序验证TLS服务器证书中编码的服务提供商的身份。
Thefollowingregistrationprocedureisusedforalltheregistriesestablishedbythisspecification.
以下注册程序适用于本规范建立的所有注册中心。
ValuesareregisteredonaSpecificationRequired[RFC5226]basisafterathree-weekreviewperiodonthejose-reg-review@ietf.orgmailinglist,ontheadviceofoneormoreDesignatedExperts.However,toallowfortheallocationofvaluespriortopublication,theDesignatedExpertsmayapproveregistrationoncetheyaresatisfiedthatsuchaspecificationwillbepublished.
在josereg上经过三周的审查后,根据规范要求[RFC5226]登记数值-review@ietf.org根据一名或多名指定专家的建议,提供邮件列表。但是,为了允许在发布之前分配值,指定专家在确信此类规范将发布后,可批准注册。
发送到邮件列表供审查的注册请求应使用适当的主题(例如,“注册请求标题参数:示例”)。
在审查期内,指定专家将批准或拒绝注册请求,并将此决定告知审查名单和IANA。拒绝应包括解释,以及(如适用)关于如何使请求成功的建议。超过21天未确定的注册请求可提请IESG注意(使用iesg@ietf.org邮件列表)以供解决。
CriteriathatshouldbeappliedbytheDesignatedExpertsincludesdeterminingwhethertheproposedregistrationduplicatesexistingfunctionality,whetheritislikelytobeofgeneralapplicabilityorusefulonlyforasingleapplication,andwhethertheregistrationdescriptionisclear.
指定专家应适用的标准包括确定拟议登记是否与现有功能重复,是否可能具有普遍适用性或仅对单一申请有用,以及登记说明是否明确。
IANAmustonlyacceptregistryupdatesfromtheDesignatedExpertsandshoulddirectallrequestsforregistrationtothereviewmailinglist.
IANA必须只接受指定专家的注册更新,并将所有注册请求发送至审查邮件列表。
ItissuggestedthatmultipleDesignatedExpertsbeappointedwhoareabletorepresenttheperspectivesofdifferentapplicationsusingthisspecification,inordertoenablebroadlyinformedreviewofregistrationdecisions.IncaseswherearegistrationdecisioncouldbeperceivedascreatingaconflictofinterestforaparticularExpert,thatExpertshoulddefertothejudgmentoftheotherExperts.
建议任命多名指定专家,他们能够代表使用本规范的不同应用的观点,以便对注册决定进行广泛知情的审查。如果注册决定可能被视为对某一专家造成利益冲突,该专家应服从其他专家的判断。
本规范为标题参数名称建立IANA“JSONWeb签名和加密标题参数”注册表。注册表记录头参数名称和对定义它的规范的引用。如果参数用法在规范之间兼容,则可以多次注册相同的头参数名称。相同标头参数名称的不同注册通常会使用不同的标头参数使用位置值。
标题参数名称:请求的名称(例如,“kid”)。由于本规范的一个核心目标是使生成的表示形式紧凑,因此建议名称简短——如果没有令人信服的理由,名称不能超过8个字符。这个名字是
casesensitive.Namesmaynotmatchotherregisterednamesinacase-insensitivemannerunlesstheDesignatedExpertsstatethatthereisacompellingreasontoallowanexception.
标题参数说明:标题参数的简要说明(例如,“密钥ID”)。
标题参数使用位置:标题参数使用位置,应该是一个或多个值“JWS”或“JWE”。
更改控制器:对于标准跟踪RFC,请列出“IESG”。对于其他人,请提供责任方的名称。还可以包括其他详细信息(例如,邮政地址、电子邮件地址、主页URI)。
SpecificationDocument(s):Referencetothedocumentordocumentsthatspecifytheparameter,preferablyincludingURIsthatcanbeusedtoretrievecopiesofthedocuments.Anindicationoftherelevantsectionsmayalsobeincludedbutisnotrequired.
ThissectionregisterstheHeaderParameternamesdefinedinSection4.1inthisregistry.
本节在此注册表中注册第4.1节中定义的标题参数名称。
o标题参数名称:“alg”o标题参数说明:算法o标题参数使用位置:JWSo变更控制器:IESGo规范文件:RFC7515第4.1.1节
o标题参数名称:“jku”o标题参数说明:JWK设置URLo标题参数使用位置:JWSo变更控制器:IESGo规范文件:RFC7515第4.1.2节
o标题参数名称:“jwk”o标题参数说明:JSONWeb密钥o标题参数使用位置:JWSo变更控制器:IESGo规范文档:RFC7515第4.1.3节
o标题参数名称:“kid”o标题参数说明:密钥IDo标题参数使用位置:JWSo变更控制器:IESGo规范文件:RFC7515第4.1.4节
o标题参数名称:“x5u”o标题参数说明:X.509URLo标题参数使用位置:JWSo变更控制器:IESGo规范文件:RFC7515第4.1.5节
o标题参数名称:“x5c”o标题参数说明:X.509证书链o标题参数使用位置:JWSo更改控制器:IESGo规范文档:RFC7515第4.1.6节
o标题参数名称:“x5t”o标题参数说明:X.509证书SHA-1指纹o标题参数使用位置:JWSo变更控制器:IESGo规范文件:RFC7515第4.1.7节
o标题参数名称:“x5t#S256”o标题参数说明:X.509证书SHA-256指纹o标题参数使用位置:JWSo变更控制器:IESGo规范文件:RFC7515第4.1.8节
o标题参数名称:“类型”o标题参数说明:类型o标题参数使用位置:JWSo变更控制器:IESGo规范文件:RFC7515第4.1.9节
o标题参数名称:“cty”o标题参数说明:内容类型o标题参数使用位置:JWSo变更控制器:IESGo规范文件:RFC7515第4.1.10节
o标题参数名称:“crit”o标题参数说明:关键o标题参数使用位置:JWSo变更控制器:IESGo规范文件:RFC7515第4.1.11节
本节以RFC6838[RFC6838]中所述的方式在“媒体类型”注册表[IANA.MediaTypes]中注册“应用程序/jose”媒体类型[RFC2046],可用于指示内容是使用JWS压缩序列化或JWE压缩序列化的JWS或JWE。本节还将“application/jose+json”媒体类型注册到“mediaTypes”注册表中,该注册表可用于指示内容是使用JWSjson序列化或JWEjson序列化的JWS或JWE。
Magicnumber(s):n/aFileextension(s):n/aMacintoshfiletypecode(s):n/aMagicnumber(s):n/aFileextension(s):n/aMacintoshfiletypecode(s):n/aoPerson&emailaddresstocontactforfurtherinformation:MichaelB.Jones,mbj@microsoft.comoIntendedusage:COMMONoRestrictionsonusage:noneoAuthor:MichaelB.Jones,mbj@microsoft.comoChangeController:IESGoProvisionalregistrationNo
o联系人和电子邮件地址,以获取更多信息:MichaelB.Jones,mbj@microsoft.como预期用途:常见o使用限制:无o作者:MichaelB.Jones,mbj@microsoft.como变更控制员:IESGo临时注册?不
oTypename:applicationoSubtypename:jose+jsonoRequiredparameters:n/aoOptionalparameters:n/aoEncodingconsiderations:8bit;application/jose+jsonvaluesarerepresentedasaJSONObject;UTF-8encodingSHOULDbeemployedfortheJSONobject.oSecurityconsiderations:SeetheSecurityConsiderationssectionofRFC7515oInteroperabilityconsiderations:n/aoPublishedspecification:RFC7515oApplicationsthatusethismediatype:NimbusJOSE+JWTlibraryoFragmentidentifierconsiderations:n/aoAdditionalinformation:
o类型名称:应用程序o子类型名称:jose+jsono必需参数:n/ao可选参数:n/ao编码注意事项:8bit;application/jose+json值表示为一个json对象;JSON对象应采用UTF-8编码。o安全注意事项:请参阅RFC7515的安全注意事项部分o互操作性注意事项:不适用o已发布的规范:RFC7515o使用此媒体类型的应用程序:NimbusJOSE+JWT库o片段标识符注意事项:不适用o其他信息:
“XML签名语法和处理版本2.0”[W3C.NOTE-xmldsig-core2-20130411]中的所有安全注意事项也适用于本规范,但特定于XML的除外。类似地,“XML签名最佳实践”[W3C.NOTE-xmldsig-bestpractices-20130411]中记录的许多最佳实践也适用于本规范,而不是特定于XML的。
Keysareonlyasstrongastheamountofentropyusedtogeneratethem.Aminimumof128bitsofentropyshouldbeusedforallkeys,anddependingupontheapplicationcontext,moremayberequired.
关键点的强度取决于生成它们所用的熵的大小。所有密钥至少应使用128位的熵,根据应用程序上下文,可能需要更多的熵。
Implementationsmustrandomlygeneratepublic/privatekeypairs,MACkeys,andpaddingvalues.Theuseofinadequatepseudorandomnumbergenerators(PRNGs)togeneratecryptographickeyscanresultinlittleornosecurity.AnattackermayfinditmucheasiertoreproducethePRNGenvironmentthatproducedthekeys,searchingtheresultingsmallsetofpossibilitiesratherthanbrute-forcesearchingthewholekeyspace.Thegenerationofqualityrandomnumbersisdifficult.RFC4086[RFC4086]offersimportantguidanceinthisarea.
实现必须随机生成公钥/私钥对、MAC密钥和填充值。使用不充分的伪随机数生成器(PRNG)生成加密密钥可能导致很少或没有安全性。攻击者可能会发现复制生成密钥的PRNG环境更容易,搜索生成的一小部分可能性,而不是暴力搜索整个密钥空间。生成高质量的随机数是困难的。RFC4086[RFC4086]在这方面提供了重要的指导。
实现必须保护签名者的私钥。签名者私钥的泄露允许攻击者伪装成签名者。
ImplementationsmustprotecttheMACkey.CompromiseoftheMACkeymayresultinundetectablemodificationoftheauthenticatedcontent.
实现必须保护MAC密钥。MAC密钥的泄露可能会导致对认证内容进行无法检测的修改。
Thekeymanagementtechniqueemployedtoobtainpublickeysmustauthenticatetheoriginofthekey;otherwise,itisunknownwhatpartysignedthemessage.
Likewise,thekeymanagementtechniqueemployedtodistributeMACkeysmustprovidedataoriginauthentication;otherwise,thecontentsaredeliveredwithintegrityfromanunknownsource.
SeeSection8.1of[JWA]forsecurityconsiderationsoncryptographicagility.
有关加密灵活性的安全注意事项,请参见[JWA]第8.1节。
WhileMACsanddigitalsignaturescanbothbeusedforintegritychecking,therearesomesignificantdifferencesbetweenthesecuritypropertiesthateachofthemprovides.Theseneedtobetakenintoconsiderationwhendesigningprotocolsandselectingthealgorithmstobeusedinprotocols.
虽然MAC和数字签名都可以用于完整性检查,但它们各自提供的安全属性之间存在一些显著差异。在设计协议和选择协议中使用的算法时,需要考虑这些因素。
BothsignaturesandMACsprovideforintegritychecking--verifyingthatthemessagehasnotbeenmodifiedsincetheintegrityvaluewascomputed.However,MACsprovidefororiginationidentificationonlyunderspecificcircumstances.Itcannormallybeassumedthataprivatekeyusedforasignatureisonlyinthehandsofasingleentity(althoughperhapsadistributedentity,inthecaseof
replicatedservers);however,aMACkeyneedstobeinthehandsofalltheentitiesthatuseitforintegritycomputationandchecking.ValidationofaMAConlyprovidescorroborationthatthemessagewasgeneratedbyoneofthepartiesthatknowsthesymmetricMACkey.ThismeansthatoriginationcanonlybedeterminedifaMACkeyisknownonlytotwoentitiesandtherecipientknowsthatitdidnotcreatethemessage.MACvalidationcannotbeusedtoproveoriginationtoathirdparty.
InsomeusagesofJWS,thereisariskofalgorithmsubstitutionattacks,inwhichanattackercanuseanexistingdigitalsignaturevaluewithadifferentsignaturealgorithmtomakeitappearthatasignerhassignedsomethingthatithasnot.TheseattackshavebeendiscussedindetailinthecontextofCryptographicMessageSyntax(CMS)[RFC6211].Thisriskariseswhenallofthefollowingaretrue:
在JWS的某些用法中,存在算法替换攻击的风险,在这种情况下,攻击者可以使用具有不同签名算法的现有数字签名值,使签名者似乎签署了它没有签署的东西。这些攻击已在加密消息语法(CMS)[RFC6211]的上下文中详细讨论。当以下所有情况均为真时,就会出现这种风险:
oVerifiersofasignaturesupportmultiplealgorithms.
o签名的验证器支持多种算法。
oGivenanexistingsignature,anattackercanfindanotherpayloadthatproducesthesamesignaturevaluewithadifferentalgorithm.
o给定一个现有签名,攻击者可以找到另一个使用不同算法生成相同签名值的有效负载。
oThepayloadcraftedbytheattackerisvalidintheapplicationcontext.
o攻击者精心编制的有效负载在应用程序上下文中有效。
Thereareseveralwaysforanapplicationtomitigatealgorithmsubstitutionattacks:
应用程序有几种方法可以减轻算法替换攻击:
oUseonlydigitalsignaturealgorithmsthatarenotvulnerabletosubstitutionattacks.Substitutionattacksareonlyfeasibleifanattackercancomputepre-imagesforahashfunctionacceptedby
o仅使用不易受替换攻击的数字签名算法。替换攻击只有在攻击者能够为用户接受的哈希函数计算预映像时才可行
therecipient.AllJWA-definedsignaturealgorithmsuseSHA-2hashes,forwhichtherearenoknownpre-imageattacks,asofthetimeofthiswriting.
收件人。截至本文撰写之时,所有JWA定义的签名算法都使用SHA-2散列,没有已知的图像前攻击。
o要求在JWS受保护的标头中携带“alg”标头参数。(使用JWS紧凑序列化时总是这样,CMS[RFC6211]采用这种方法。)
o在应用程序有效负载中包含包含算法的字段,并要求在验证期间将其与“alg”头参数匹配。(这是PKIX[RFC5280]采用的方法。)
CreatorsofJWSsshouldnotallowthirdpartiestoinsertarbitrarycontentintothemessagewithoutaddingentropynotcontrolledbythethirdparty.
JWSs的创建者不应允许第三方在不添加不受第三方控制的熵的情况下向消息中插入任意内容。
Whencryptographicalgorithmsareimplementedinsuchawaythatsuccessfuloperationstakeadifferentamountoftimethanunsuccessfuloperations,attackersmaybeabletousethetimedifferencetoobtaininformationaboutthekeysemployed.Therefore,suchtimingdifferencesmustbeavoided.
Whilenotdirectlyinscopeforthisspecification,notethatapplicationsusingJWS(orJWE)objectscanthwartreplayattacksbyincludingauniquemessageidentifierasintegrity-protectedcontentintheJWS(orJWE)messageandhavingtherecipientverifythatthemessagehasnotbeenpreviouslyreceivedoractedupon.
虽然不直接在本规范的范围内,但请注意,使用JWS(或JWE)对象的应用程序可以通过在JWS(或JWE)消息中包含一个唯一的消息标识符作为完整性保护的内容,并让收件人验证消息之前未被接收或处理,从而阻止重播攻击。
出于兼容性原因,计算“x5t”(X.509证书SHA-1指纹)值时使用SHA-1哈希。如果开发了产生SHA-1哈希冲突的有效方法,并且如果攻击者希望干扰给定系统上已知证书的使用,则可以通过创建另一个SHA-1哈希值相同的证书并将其添加到目标受害者使用的证书存储中来实现。此攻击成功的先决条件是攻击者对目标受害者的证书存储具有写访问权。
或者,可以使用“x5t#S256”(X.509证书SHA-256指纹)头参数代替“x5t”。然而,在撰写本文时,还没有开发平台支持SHA-256证书指纹。
StrictJSON[RFC7159]validationisasecurityrequirement.IfmalformedJSONisreceived,thentheintentoftheproducerisimpossibletoreliablydiscern.AmbiguousandpotentiallyexploitablesituationscouldariseiftheJSONparseruseddoesnotrejectmalformedJSONsyntax.Inparticular,anyJSONinputsnotconformingtotheJSON-textsyntaxdefinedinRFC7159MUSTberejectedintheirentiretybyJSONparsers.
严格的JSON[RFC7159]验证是一项安全要求。如果接收到格式错误的JSON,则无法可靠地识别生产者的意图。如果使用的JSON解析器不拒绝格式错误的JSON语法,则可能会出现歧义和可能被利用的情况。特别是,JSON解析器必须完全拒绝任何不符合RFC7159中定义的JSON文本语法的JSON输入。
“JavaScript对象表示法(JSON)数据交换格式”[RFC7159]第4节指出,“对象中的名称应该是唯一的”,而本规范指出
JOSE头中的头参数名称必须是唯一的;JWS解析器必须拒绝具有重复头参数名称的JWSs,或者使用只返回词汇上最后一个重复成员名称的JSON解析器,如ECMAScript5.1[ECMAScript]第15.12节(“JSON对象”)所述。
因此,本规范要求生产者将[RFC7159]第4节中的“应该”视为“必须”,消费者将其视为“必须”或按ECMAScript5.1中规定的方式处理。如果使用的JSON解析器不强制成员名称的唯一性或为重复的成员名称返回不可预测的值,则可能会出现不明确和可能被利用的情况。
一些JSON解析器可能不会拒绝在有效输入后包含额外有效字符的输入。例如,输入“{”标记“:“value”}ABCD”包含一个有效的JSON文本对象,后跟额外的字符“ABCD”。实现必须考虑包含这样的输入的JWSS无效。
标题参数名称和算法名称是Unicode字符串。出于安全原因,在执行任何转义处理后(根据RFC7159[RFC7159]第8.3节),必须逐字比较这些名称的表示。这意味着,例如,这些JSON字符串必须进行相等的比较(“sig”、“sig”、“si\u0073ig”),而这些字符串必须进行不相等的比较(“sig”、“sig”、“si\u0047”)。
JSON字符串可以包含Unicode基本多语言平面之外的字符。例如,G谱号字符(U+1D11E)可以在JSON字符串中表示为“\uD834\uDD1E”。理想情况下,JWS实现应该确保基本多语言平面之外的字符被正确地保留和比较;或者,如果由于这些字符在底层JSON实现中存在限制而无法执行此操作,则必须拒绝包含这些字符的输入。
[ITU.X690.2008]国际电信联盟,“信息技术-ASN.1编码规则:基本编码规则(BER)、规范编码规则(CER)和区分编码规则(DER)规范”,ITU-T建议X.690,2008年。
ThissectionprovidesseveralexamplesofJWSs.WhilethefirstthreeexamplesallrepresentJSONWebTokens(JWTs)[JWT],thepayloadcanbeanyoctetsequence,asshowninAppendixA.4.
本节提供了几个JWSs示例。虽然前三个示例都表示JSONWeb令牌(JWT)[JWT],但有效负载可以是任何八位字节序列,如附录A.4所示。
ThefollowingexampleJWSProtectedHeaderdeclaresthatthedatastructureisaJWT[JWT]andtheJWSSigningInputissecuredusingtheHMACSHA-256algorithm.
为了消除上述JSON对象表示中的潜在歧义,下面还包括了表示本示例中使用的UTF8(JWS保护头)的实际八位字节序列。(请注意,由于换行符的平台表示不同(CRLF与LF),可能会产生歧义。),行首和行尾的间距不同,最后一行是否有终止换行符,以及其他原因。在本示例中使用的表示法中,第一行没有前导或尾随空格,第一行和第二行之间出现CRLF换行符(13,10),第二行有一个前导空格(32)并且没有尾随空格,最后一行没有终止换行符。)本例中代表UTF8(JWS保护头)的八位字节(使用JSON数组表示法)为:
[123,34,116,121,112,34,58,34,74,87,84,34,44,13,10,32,34,97,108,103,34,58,34,72,83,50,53,54,34,125]
EncodingthisJWSProtectedHeaderasBASE64URL(UTF8(JWSProtectedHeader))givesthisvalue:
eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9TheJWSPayloadusedinthisexampleistheoctetsoftheUTF-8representationoftheJSONobjectbelow.(Notethatthepayloadcanbeanybase64url-encodedoctetsequenceandneednotbeabase64url-encodedJSONobject.)
本例中使用的JWS负载是下面JSON对象的UTF-8表示形式的八位字节。(注意,有效负载可以是任何base64url编码的八位字节序列,而不需要是base64url编码的JSON对象。)
以下八位字节序列是JWS有效负载,它是本例中用于上述JSON对象的UTF-8表示:
[123,34,105,115,115,34,58,34,106,111,101,34,44,13,10,32,34,101,120,112,34,58,49,51,48,48,56,49,57,51,56,48,44,13,10,32,34,104,116,116,112,58,47,47,101,120,97,109,112,108,101,46,99,111,109,47,105,115,95,114,111,111,116,34,58,116,114,117,101,125]
EncodingthisJWSPayloadasBASE64URL(UTF8(JWSPayload))givesthisvalue(withlinebreaksfordisplaypurposesonly):
将此JWS有效负载编码为BASE64URL(UTF8(JWS有效负载))将给出此值(换行符仅用于显示目的):
eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ
eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9。EYJPC3MIOIJQB2UILA0KIJLEHAIOJEZMDA4MTKZODAQIMH0DHA6LY9LEGFTcGxlLmNvbS9pc19yb290Ijp0cnVlfQ
TheresultingJWSSigningInputvalue,whichistheASCIIrepresentationofabovestring,isthefollowingoctetsequence(usingJSONarraynotation):
生成的JWS签名输入值是上述字符串的ASCII表示形式,是以下八位字节序列(使用JSON数组表示法):
[101,121,74,48,101,88,65,105,79,105,74,75,86,49,81,105,76,65,48,75,73,67,74,104,98,71,99,105,79,105,74,73,85,122,73,49,78,105,74,57,46,101,121,74,112,99,51,77,105,79,105,74,113,98,50,85,105,76,65,48,75,73,67,74,108,101,72,65,105,79,106,69,122,77,68,65,52,77,84,107,122,79,68,65,115,68,81,111,103,73,109,104,48,100,72,65,54,76,121,57,108,101,71,70,116,99,71,120,108,76,109,78,118,98,83,57,112,99,49,57,121,98,50,57,48,73,106,112,48,99,110,86,108,102,81]
HMACsaregeneratedusingkeys.ThisexampleusesthesymmetrickeyrepresentedinJSONWebKey[JWK]formatbelow(withlinebreakswithinvaluesfordisplaypurposesonly):
HMAC是使用密钥生成的。此示例使用以下JSONWebkey[JWK]格式表示的对称密钥(值中的换行符仅用于显示):
{“kty”:“oct”,“k”:“AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr\UT-1qS0gZH75AKTMN3YJ0IPS4CGUUTWJAZR1Z9CAOW”}
RunningtheHMACSHA-256algorithmontheJWSSigningInputwiththiskeyyieldsthisJWSSignatureoctetsequence:
使用此密钥在JWS签名输入上运行HMACSHA-256算法将生成此JWS签名八位字节序列:
[116,24,223,180,151,153,224,37,79,250,96,125,216,173,187,186,22,212,37,77,105,214,191,240,91,88,5,88,83,132,141,121]
EncodingthisJWSSignatureasBASE64URL(JWSSignature)givesthisvalue:
将此JWS签名编码为BASE64URL(JWS签名)将给出以下值:
因为“alg”头参数是“HS256”,所以我们验证JWS签名中包含的HMACSHA-256值。
TovalidatetheHMACvalue,werepeatthepreviousprocessofusingthecorrectkeyandtheJWSSigningInput(whichistheinitialsubstringoftheJWSCompactSerializationrepresentationupuntilbutnotincludingthesecondperiodcharacter)asinputtotheHMACSHA-256functionandthentakingtheoutputanddeterminingifitmatchestheJWSSignature(whichisbase64urldecodedfromthevalueencodedintheJWSrepresentation).Ifitmatchesexactly,theHMAChasbeenvalidated.
为了验证HMAC值,我们重复前面的过程,使用正确的密钥和JWS签名输入(这是JWS紧凑序列化表示的初始子字符串,直到但不包括第二个句点字符)作为HMACSHA-256函数的输入,然后获取输出并确定其是否匹配JWS签名(该签名是从JWS表示中编码的值解码而来的base64url)。如果完全匹配,则已验证HMAC。
本例中受JWS保护的头在两个方面与前一个示例不同。首先,由于使用了不同的算法,“alg”值不同。其次,仅出于说明目的,不使用可选的“typ”(type)头参数。(此差异与所采用的算法无关。)使用的JWS保护标头为:
本例中代表UTF8(JWS保护头)的八位字节(使用JSON数组表示法)为:
[123,34,97,108,103,34,58,34,82,83,50,53,54,34,125]
eyJhbGciOiJSUzI1NiJ9
EYJHBGCOIJSUZI1NIJ9
TheJWSPayloadusedinthisexample,whichfollows,isthesameasinthepreviousexample.SincetheBASE64URL(JWSPayload)valuewillthereforebethesame,itscomputationisnotrepeatedhere.
下面的示例中使用的JWS有效负载与前面的示例中相同。由于BASE64URL(JWS有效负载)值因此是相同的,因此这里不重复其计算。
eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ
eyJhbGciOiJSUzI1NiJ9。EYJPC3MIOIJQB2UILA0KIJLEHAIOJEZMDA4MTKZODAQIMH0DHA6LY9LEGFTcGxlLmNvbS9pc19yb290Ijp0cnVlfQ
TheresultingJWSSigningInputvalue,whichistheASCIIrepresentationofabovestring,isthefollowingoctetsequence:
生成的JWS签名输入值是上述字符串的ASCII表示形式,是以下八位字节序列:
[101,121,74,104,98,71,99,105,79,105,74,83,85,122,73,49,78,105,74,57,46,101,121,74,112,99,51,77,105,79,105,74,113,98,50,85,105,76,65,48,75,73,67,74,108,101,72,65,105,79,106,69,122,77,68,65,52,77,84,107,122,79,68,65,115,68,81,111,103,73,109,104,48,100,72,65,54,76,121,57,108,101,71,70,116,99,71,120,108,76,109,78,118,98,83,57,112,99,49,57,121,98,50,57,48,73,106,112,48,99,110,86,108,102,81]
ThisexampleusestheRSAkeyrepresentedinJSONWebKey[JWK]formatbelow(withlinebreakswithinvaluesfordisplaypurposesonly):
此示例使用以下JSONWebkey[JWK]格式表示的RSA密钥(值中的换行符仅用于显示):
TheRSAprivatekeyisthenpassedtotheRSAsigningfunction,whichalsotakesthehashtype,SHA-256,andtheJWSSigningInputasinputs.Theresultofthedigitalsignatureisanoctetsequence,whichrepresentsabig-endianinteger.Inthisexample,itis:
然后将RSA私钥传递给RSA签名函数,该函数还将哈希类型SHA-256和JWS签名输入作为输入。数字签名的结果是一个八进制序列,它表示一个大端整数。在本例中,它是:
[112,46,33,137,67,232,143,209,30,181,216,45,191,120,69,243,65,6,174,27,129,255,247,115,17,22,173,209,113,125,131,101,109,66,10,253,60,150,238,221,115,162,102,62,81,102,104,123,0,11,135,34,110,1,135,237,16,115,249,69,229,130,173,252,239,22,216,90,121,142,232,198,109,219,61,184,151,91,23,208,148,2,190,237,213,217,217,112,7,16,141,178,129,96,213,248,4,12,167,68,87,98,184,31,190,127,249,217,46,10,231,111,36,242,91,51,187,230,244,74,230,30,177,4,10,203,32,4,77,62,249,18,142,212,1,48,121,91,212,189,59,65,238,202,208,102,171,101,25,129,253,228,141,247,127,55,45,195,139,159,175,221,59,239,177,139,93,163,204,60,46,176,47,158,58,65,214,18,202,173,21,145,18,115,160,95,35,185,232,56,250,175,132,157,105,132,41,239,90,30,136,121,130,54,195,212,14,96,69,34,165,68,200,242,122,122,45,184,6,99,209,108,247,202,234,86,222,64,92,178,33,90,69,178,194,85,102,181,90,193,167,72,160,112,223,200,163,42,70,149,67,208,25,238,251,71]
EncodingthesignatureasBASE64URL(JWSSignature)producesthisvalue(withlinebreaksfordisplaypurposesonly):
将签名编码为BASE64URL(JWS签名)将生成此值(换行符仅用于显示):
由于“alg”头参数是“RS256”,我们验证JWS签名中包含的RSASSA-PKCS1-v1_5SHA-256数字签名。
ValidatingtheJWSSignatureisabitdifferentfromthepreviousexample.Wepassthepublickey(n,e),theJWSSignature(whichisbase64urldecodedfromthevalueencodedintheJWSrepresentation),andtheJWSSigningInput(whichistheinitialsubstringoftheJWSCompactSerializationrepresentationupuntilbutnotincludingthesecondperiodcharacter)toanRSASSA-PKCS1-v1_5signatureverifierthathasbeenconfiguredtousetheSHA-256hashfunction.
验证JWS签名与前面的示例略有不同。我们传递公钥(n,e)、JWS签名(它是从JWS表示中编码的值解码而来的base64url)和JWS签名输入(它是JWS紧凑序列化表示的初始子字符串,直到但不包括第二个句点字符)发送到已配置为使用SHA-256哈希函数的RSASSA-PKCS1-v1_5签名验证器。
TheJWSProtectedHeaderforthisexamplediffersfromthepreviousexamplebecauseadifferentalgorithmisbeingused.TheJWSProtectedHeaderusedis:
此示例的JWS受保护标头与前一示例不同,因为使用了不同的算法。使用的JWS受保护标头为:
[123,34,97,108,103,34,58,34,69,83,50,53,54,34,125]
eyJhbGciOiJFUzI1NiJ9
EYJHBGCOIJFUZI1NIJ9
TheJWSPayloadusedinthisexample,whichfollows,isthesameasinthepreviousexamples.SincetheBASE64URL(JWSPayload)valuewillthereforebethesame,itscomputationisnotrepeatedhere.
eyJhbGciOiJFUzI1NiJ9.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ
EYJHBGCOIJFUZI1NIJ9。EYJPC3MIOIJQB2UILA0KIJLEHAIOJEZMDA4MTKZODAQIMH0DHA6LY9LEGFTcGxlLmNvbS9pc19yb290Ijp0cnVlfQ
[101,121,74,104,98,71,99,105,79,105,74,70,85,122,73,49,78,105,74,57,46,101,121,74,112,99,51,77,105,79,105,74,113,98,50,85,105,76,65,48,75,73,67,74,108,101,72,65,105,79,106,69,122,77,68,65,52,77,84,107,122,79,68,65,115,68,81,111,103,73,109,104,48,100,72,65,54,76,121,57,108,101,71,70,116,99,71,120,108,76,109,78,118,98,83,57,112,99,49,57,121,98,50,57,48,73,106,112,48,99,110,86,108,102,81]
ThisexampleusestheEllipticCurvekeyrepresentedinJSONWebKey[JWK]formatbelow:
此示例使用以下JSONWeb密钥[JWK]格式表示的椭圆曲线密钥:
{“kty”:“EC”,“crv”:“P-256”,“x”:“F83OJ3D2xF1BG8VUB9TLEGHMZV76E8TUS9UPHVRVEU”,“y”:“x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0”,“d”:“jpsQnnGQmL-YBIffH1136cspYG6-0iY7X1fCE9-E9LI”
TheEllipticCurveDigitalSignatureAlgorithm(ECDSA)privatepartdisthenpassedtoanECDSAsigningfunction,whichalsotakesthecurvetype,P-256,thehashtype,SHA-256,andtheJWSSigningInputasinputs.TheresultofthedigitalsignatureistheEllipticCurve
然后将椭圆曲线数字签名算法(ECDSA)私有部分d传递给ECDSA签名函数,该函数还将曲线类型P-256、哈希类型SHA-256和JWS签名输入作为输入。数字签名的结果是椭圆曲线
(EC)point(R,S),whereRandSareunsignedintegers.Inthisexample,theRandSvalues,givenasoctetsequencesrepresentingbig-endianintegersare:
(EC)点(R,S),其中R和S是无符号整数。在本例中,作为表示大端整数的八位字节序列给出的R和S值为:
JWS签名是值R||S。将签名编码为BASE64URL(JWS签名)将生成此值(换行符仅用于显示):
DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q
DTEHU3LJBEG8L38VWAFAQUAQOYKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q
eyJhbGciOiJFUzI1NiJ9.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ.DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q
EYJHBGCOIJFUZI1NIJ9。EYJPC3MIOIJQB2UILA0KIJLEHAIOJEZMDA4MTKZODAZODAQIMH0DHA6LY9LEGFTcGxlLmNvbS9pc19yb290Ijp0cnVlfQ。DTEHU3LJBEG8L38VWAFAQUAQOYKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q
由于“alg”头参数是“ES256”,我们验证JWS签名中包含的ECDSAP-256SHA-256数字签名。
ValidatingtheJWSSignatureisabitdifferentfromthepreviousexamples.Weneedtosplitthe64memberoctetsequenceoftheJWSSignature(whichisbase64urldecodedfromthevalueencodedintheJWSrepresentation)intotwo32octetsequences,thefirstrepresentingRandthesecondS.Wethenpassthepublickey(x,y),thesignature(R,S),andtheJWSSigningInput(whichistheinitialsubstringoftheJWSCompactSerializationrepresentationupuntil
验证JWS签名与前面的示例略有不同。我们需要将JWS签名的64个成员八位组序列(从JWS表示中编码的值中解码的base64url)拆分为两个32个八位组序列,第一个表示R,第二个表示S。然后我们传递公钥(x,y)、签名(R,S)和JWS签名输入(这是JWS紧凑序列化表示的初始子字符串,直到
butnotincludingthesecondperiodcharacter)toanECDSAsignatureverifierthathasbeenconfiguredtousetheP-256curvewiththeSHA-256hashfunction.
但不包括第二个句点字符)到已配置为使用P-256曲线和SHA-256哈希函数的ECDSA签名验证器。
TheJWSProtectedHeaderforthisexamplediffersfromthepreviousexamplebecausedifferentECDSAcurvesandhashfunctionsareused.TheJWSProtectedHeaderusedis:
本例的JWS-Protected标头与上一个示例不同,因为使用了不同的ECDSA曲线和哈希函数。使用的JWS受保护标头为:
[123,34,97,108,103,34,58,34,69,83,53,49,50,34,125]
eyJhbGciOiJFUzUxMiJ9
本例中使用的JWS有效负载是ASCII字符串“Payload”。此字符串的表示形式为以下八位字节序列:
[80,97,121,108,111,97,100]
EncodingthisJWSPayloadasBASE64URL(JWSPayload)givesthisvalue:
将此JWS有效负载编码为BASE64URL(JWS有效负载)将给出以下值:
UGF5bG9hZA
eyJhbGciOiJFUzUxMiJ9.UGF5bG9hZA
[101,121,74,104,98,71,99,105,79,105,74,70,85,122,85,120,77,105,74,57,46,85,71,70,53,98,71,57,104,90,65]
ThisexampleusestheEllipticCurvekeyrepresentedinJSONWebKey[JWK]formatbelow(withlinebreakswithinvaluesfordisplaypurposesonly):
此示例使用以下JSONWebkey[JWK]格式表示的椭圆曲线密钥(值中的换行符仅用于显示):
“x”x”x”x“x”x“x”x“x”x“x”x“x”x“x”x“x”x“x”x“x”x“x”x“x”x“x”x“x”x“x”x“x”x“x”x“x”x“x”x”x“y”x“y”y”y:“y”y”y:“y”y”y:“y”y”y:“y”y”x“y”x“y”x“y”y”x“y”x“y”y”y”y:“ADSMRA“ADSMR43ZZNNNZZZNNNXxxxxxx“x“x”x“x”x“x“x”x”x”x“x“x“x”x”x”x“x“x”x”x“x”x”x“x“x”x”x”x”x“x“x”x”x“x”x“x”“}
TheECDSAprivatepartdisthenpassedtoanECDSAsigningfunction,whichalsotakesthecurvetype,P-521,thehashtype,SHA-512,andtheJWSSigningInputasinputs.TheresultofthedigitalsignatureistheECpoint(R,S),whereRandSareunsignedintegers.Inthisexample,theRandSvalues,givenasoctetsequencesrepresentingbig-endianintegersare:
ECDSA私有部分d随后被传递给ECDSA签名函数,该函数还将曲线类型P-521、哈希类型SHA-512和JWS签名输入作为输入。数字签名的结果是EC点(R,S),其中R和S是无符号整数。在本例中,作为表示大端整数的八位字节序列给出的R和S值为:
AdwMgeerwtHoh-l192l60hp9wAHZFVJbLfD_UxMi70cwnZOYaRI1bKPWROc-mZZqwqT2SI-KGDKB34XO0aw_7XdtAG8GaSwFKdCAPZgoXD2YBJZCPEX3xKpRwcdOO8KpEHwJjyqOgzDO7iKvU8vcnwNrmxYbSW9ERBXukOXolLzeO_Jn
AdwMgeerwtHoh-l192l60hp9wAHZFVJbLfD_UxMi70cwnZOYaRI1bKPWROc-mZZqwqT2SI-KGDKB34XO0aw_7XdtAG8GaSwFKdCAPZgoXD2YBJZCPEX3xKpRwcdOO8KpEHWJJJYGZDO7IKVU8VCNWNRMXYBSW9ERBxUKOXOLZEOJn
eyJhbGciOiJFUzUxMiJ9.UGF5bG9hZA.AdwMgeerwtHoh-l192l60hp9wAHZFVJbLfD_UxMi70cwnZOYaRI1bKPWROc-mZZqwqT2SI-KGDKB34XO0aw_7XdtAG8GaSwFKdCAPZgoXD2YBJZCPEX3xKpRwcdOO8KpEHwJjyqOgzDO7iKvU8vcnwNrmxYbSW9ERBXukOXolLzeO_Jn
eyJhbGciOiJFUzUxMiJ9。UGF5bG9hZA。AdwMgeerwtHoh-l192l60hp9wAHZFVJbLfD_UxMi70cwnZOYaRI1bKPWROc-mZZqwqT2SI-KGDKB34XO0aw_7XdtAG8GaSwFKdCAPZgoXD2YBJZCPEX3xKpRwcdOO8KpEHWJJJYGZDO7IKVU8VCNWNRMXYBSW9ERBxUKOXOLZEOJn
由于“alg”头参数是“ES512”,我们验证JWS签名中包含的ECDSAP-521SHA-512数字签名。
ValidatingthisJWSSignatureisverysimilartothepreviousexample.Weneedtosplitthe132-memberoctetsequenceoftheJWSSignatureintotwo66-octetsequences,thefirstrepresentingRandthesecondS.Wethenpassthepublickey(x,y),thesignature(R,S),andtheJWSSigningInputtoanECDSAsignatureverifierthathasbeenconfiguredtousetheP-521curvewiththeSHA-512hashfunction.
验证此JWS签名与前面的示例非常相似。我们需要将JWS签名的132个成员八位组序列拆分为两个66个八位组序列,第一个代表R,第二个代表S。然后,我们将公钥(x,y)、签名(R,S)和JWS签名输入传递给ECDSA签名验证器,该验证器已配置为使用带有SHA-512哈希函数的P-521曲线。
ThefollowingexampleJWSProtectedHeaderdeclaresthattheencodedobjectisanUnsecuredJWS:
eyJhbGciOiJub25lIn0
JWS签名是空的八位字节字符串,BASE64URL(JWS签名)是空字符串。
eyJhbGciOiJub25lIn0.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ.
eyJhbGciOiJub25lIn0。EYJPC3MIOIJQB2UILA0KIJLEHAIOJEZMDA4MTKZODAZODAQIMH0DHA6LY9LEGFTcGxlLmNvbS9pc19yb290Ijp0cnVlfQ。
ThissectioncontainsanexampleusingthegeneralJWSJSONSerializationsyntax.Thisexampledemonstratesthecapabilityforconveyingmultipledigitalsignaturesand/orMACsforthesamepayload.
本节包含一个使用通用JWSJSON序列化语法的示例。此示例演示了为同一有效负载传输多个数字签名和/或MAC的能力。
TheJWSPayloadusedinthisexampleisthesameasthatusedintheexamplesinAppendixA.2andAppendixA.3(withlinebreaksfordisplaypurposesonly):
本示例中使用的JWS有效载荷与附录A.2和附录A.3中示例中使用的JWS有效载荷相同(换行符仅用于显示目的):
Twodigitalsignaturesareusedinthisexample:thefirstusingRSASSA-PKCS1-v1_5SHA-256andthesecondusingECDSAP-256SHA-256.Forthefirst,theJWSProtectedHeaderandkeyarethesameasinAppendixA.2,resultinginthesameJWSSignaturevalue;therefore,itscomputationisnotrepeatedhere.Forthesecond,theJWSProtectedHeaderandkeyarethesameasinAppendixA.3,resultinginthesameJWSSignaturevalue;therefore,itscomputationisnotrepeatedhere.
本例中使用了两个数字签名:第一个使用RSASSA-PKCS1-v1_5SHA-256,第二个使用ECDSAP-256SHA-256。对于第一种情况,JWS保护的头和密钥与附录A.2中的相同,从而产生相同的JWS签名值;因此,此处不再重复其计算。对于第二种情况,JWS保护的头和密钥与附录A.3中的相同,从而产生相同的JWS签名值;因此,此处不再重复其计算。
TheJWSProtectedHeadervalueusedforthefirstsignatureis:
用于第一个签名的JWS受保护标头值为:
TheJWSProtectedHeadervalueusedforthesecondsignatureis:
用于第二个签名的JWS受保护标头值为:
KeyIDvaluesaresuppliedforbothkeysusingper-signatureHeaderParameters.ThetwoJWSUnprotectedHeadervaluesusedtorepresentthesekeyIDsare:
使用每个签名头参数为两个密钥提供密钥ID值。用于表示这些密钥ID的两个JWS未受保护的头值是:
和
结合提供的JWS受保护标头和JWS未受保护标头值,分别用于第一个和第二个签名的JOSE标头值为:
这些值的完整JWSJSON序列化如下(值中的换行符仅用于显示):
本节包含一个使用扁平化JWSJSON序列化语法的示例。此示例演示了在扁平JSON结构中传输单个数字签名或MAC的能力。
ThevaluesinthisexamplearethesameasthoseinthesecondsignatureofthepreviousexampleinAppendixA.6.
本示例中的值与附录A.6中前一示例的第二个签名中的值相同。
ThecompleteJWSJSONSerializationforthesevaluesisasfollows(withlinebreakswithinvaluesfordisplaypurposesonly):
附录B“x5c”(X.509证书链)示例
下面的JSON数组是一个证书链示例,根据第4.1.6节,该证书链可用作“x5c”(X.509证书链)头参数的值(值中的换行符仅用于显示):
Thisappendixdescribeshowtoimplementbase64urlencodinganddecodingfunctionswithoutpaddingbaseduponstandardbase64encodinganddecodingfunctionsthatdousepadding.
本附录描述了如何基于使用填充的标准base64编码和解码函数,在没有填充的情况下实现base64url编码和解码函数。
Tobeconcrete,exampleC#codeimplementingthesefunctionsisshownbelow.Similarcodecouldbeusedinotherlanguages.
具体来说,实现这些函数的示例C#代码如下所示。类似的代码可以在其他语言中使用。
根据上面的示例代码,需要添加到base64url编码字符串末尾的“=”填充字符数(无需填充即可将其转换为带填充的字符串)是编码字符串长度的确定函数。具体而言,如果长度mod4为0,则不添加填充;如果长度mod4为2,则添加两个“=”填充字符;如果长度mod4为3,则添加一个“=”填充字符;如果长度mod4为1,则输入格式不正确。
Anexamplecorrespondencebetweenunencodedandencodedvaluesfollows.Theoctetsequencebelowencodesintothestringbelow,whichwhendecoded,reproducestheoctetsequence.
下面是未编码值和编码值之间的对应关系示例。下面的八位字节序列编码到下面的字符串中,该字符串在解码时再现八位字节序列。
3236255224193A-z_4ME
3236255224193A-ze
ThisappendixdescribesasetofpossiblealgorithmsforselectingthekeytobeusedtovalidatethedigitalsignatureorMACofaJWSorforselectingthekeytobeusedtodecryptaJWE.Thisguidancedescribesafamilyofpossiblealgorithmsratherthanasinglealgorithm,becauseindifferentcontexts,notallthesourcesofkeyswillbeused,theycanbetriedindifferentorders,andsometimesnotallthecollectedkeyswillbetried;hence,differentalgorithmswillbeusedindifferentapplicationcontexts.
本附录描述了一组可能的算法,用于选择用于验证JWS的数字签名或MAC的密钥,或选择用于解密JWE的密钥。本指南描述了一系列可能的算法,而不是单一的算法,因为在不同的上下文中,不会使用所有的密钥源,它们可以按不同的顺序进行尝试,有时也不会尝试所有收集的密钥;因此,将在不同的应用环境中使用不同的算法。
以下步骤仅用于说明目的;特定的应用程序可以并且可能使用不同的算法,或者以不同的顺序执行某些步骤。特定的应用程序通常会有一个更简单的方法来确定要使用的键,因为可能有一个或两个键选择方法供应用程序使用。本附录补充了第6节中关于关键位置的规范性信息。
Thesealgorithmsincludethefollowingsteps.Notethatthestepscanbeperformedinanyorderanddonotneedtobetreatedasdistinct.Forexample,keyscanbetriedassoonastheyarefound,ratherthancollectingallthekeysbeforetryingany.
这些算法包括以下步骤。请注意,这些步骤可以按任何顺序执行,无需视为不同的步骤。例如,可以在找到密钥后立即进行尝试,而不是在尝试任何密钥之前收集所有密钥。
1.Collectthesetofpotentiallyapplicablekeys.Sourcesofkeysmayinclude:
*Keyssuppliedbytheapplicationprotocolbeingused.
*由正在使用的应用程序协议提供的密钥。
*“jku”(JWKSetURL)头参数引用的键。
*“jwk”(JSONWeb键)头参数提供的键。
*“x5u”(X.509URL)头参数引用的键。
*“x5c”(X.509证书链)头参数提供的密钥。
*Otherapplicablekeysavailabletotheapplication.
*应用程序可用的其他适用密钥。
Theorderforcollectingandtryingkeysfromdifferentkeysourcesistypicallyapplicationdependent.Forexample,frequently,allkeysfromaonesetoflocations,suchaslocalcaches,willbetriedbeforecollectingandtryingkeysfromotherlocations.
从不同密钥源收集和尝试密钥的顺序通常取决于应用程序。例如,通常情况下,在从其他位置收集和尝试密钥之前,将尝试来自一组位置(如本地缓存)的所有密钥。
2.筛选收集的密钥集。例如,某些应用程序将仅使用“kid”(密钥ID)或“x5t”(X.509证书SHA-1指纹)参数引用的密钥。如果应用程序使用JWK“alg”(算法)、“use”(公钥使用)或“key_ops”(密钥操作)参数,则这些参数值不正确的密钥将被排除在外。此外,可以过滤键,以特定于应用程序的方式包括或排除具有某些其他成员值的键。对于某些应用程序,将不应用任何筛选。
3.对收集的密钥集进行排序。例如,“kid”(密钥ID)或“x5t”(X.509证书SHA-1指纹)参数引用的密钥可能会在没有这两个值的密钥之前进行尝试。同样,具有某些成员值的键可能会在具有其他成员值的键之前排序。对于某些应用,将不进行订购。
5.AttemptsignatureorMACvalidationforaJWSordecryptionofaJWEwithsomeorallofthecollectedandpossiblyfilteredand/ororderedkeys.Alimitonthenumberofkeystobetriedmightbeapplied.Thisprocesswillnormallyterminatefollowingasuccessfulvalidationordecryption.
5.尝试对JWS进行签名或MAC验证,或使用部分或全部收集的、可能已过滤和/或已排序的密钥对JWE进行解密。可能会对要尝试的密钥数量施加限制。此过程通常在成功验证或解密后终止。
NotethatitisreasonableforsomeapplicationstoperformsignatureorMACvalidationpriortomakingatrustdecisionaboutakey,sincekeysforwhichthevalidationfailsneednotrustdecision.
请注意,某些应用程序在对密钥作出信任决定之前执行签名或MAC验证是合理的,因为验证失败的密钥不需要信任决定。
附录E“crit”标题参数的否定测试用例
TheJWSProtectedHeadervalueforthisJWSis:
此JWS的JWS保护标头值为:
必须拒绝的完整JWS如下(换行符仅用于显示目的):
eyJhbGciOiJub25lIiwNCiAiY3JpdCI6WyJodHRwOi8vZXhhbXBsZS5jb20vVU5ERUZJTkVEIl0sDQogImh0dHA6Ly9leGFtcGxlLmNvbS9VTkRFRklORUQiOnRydWUNCn0.RkFJTA.
EYJHBGCIOIJUB25LIIWYJODHRWOI8VZXHBXBS5JB20VVU5ERUZJTKVEIL0SDQOGIMH0DHA6LY9LegftCGXLLMNVBS9VTKRFKloruQionRYDWUNCN0。RkFJTA。
在某些上下文中,保护JWS中不包含的内容的完整性非常有用。一种方法是以正常方式创建JWS,使用内容的表示作为有效负载,然后从JWS中删除有效负载表示,并将修改后的对象发送给收件人,而不是JWS。使用JWS紧凑序列化时,删除是通过将第二个字段(包含BASE64URL(JWS有效负载))值替换为空字符串来完成的;使用JWSJSON序列化时,删除是通过删除“payload”成员来完成的。此方法假设接收方可以重建JWS中使用的确切有效负载。为了使用修改后的对象,接收者通过将有效负载表示重新插入到修改后的对象中来重构JW,并以通常的方式使用生成的JW。请注意,此方法不需要JWS库的支持,因为应用程序可以通过修改标准JWS库的输入和输出来使用此方法。
Acknowledgements
致谢
SolutionsforsigningJSONcontentwerepreviouslyexploredbyMagicSignatures[MagicSignatures],JSONSimpleSign[JSS],andCanvasApplications[CanvasApp],allofwhichinfluencedthisdocument.
签名JSON内容的解决方案之前由MagicSignatures[MagicSignatures]、JSONSimpleSign[JSS]和CanvasApp[CanvasApp]探索,所有这些都影响了本文档。
ThankstoAxelNennkerforhisearlyimplementationandfeedbackontheJWSandJWEspecifications.
感谢AxelNennker对JWS和JWE规范的早期实施和反馈。
ThisspecificationistheworkoftheJOSEworkinggroup,whichincludesdozensofactiveanddedicatedparticipants.Inparticular,thefollowingindividualscontributedideas,feedback,andwordingthatinfluencedthisspecification:
本规范是JOSE工作组的工作,该工作组包括数十名积极和专注的参与者。特别是,以下个人提供了影响本规范的想法、反馈和措辞:
DirkBalfanz,RichardBarnes,BrianCampbell,AlissaCooper,BrenodeMedeiros,StephenFarrell,YaronY.Goland,DickHardt,JoeHildebrand,JeffHodges,RussHousley,EdmundJay,TeroKivinen,BenLaurie,TedLemon,JamesManger,MattMiller,KathleenMoriarty,TonyNadalin,HidekiNara,AxelNennker,JohnPanzer,RayPolk,EmmanuelRaviart,EricRescorla,PeteResnick,JimSchaad,PaulTarjan,HannesTschofenig,andSeanTurner.
德克·巴尔芬兹、理查德·巴恩斯、布赖恩·坎贝尔、艾莉莎·库珀、布伦诺·德梅德罗斯、斯蒂芬·法雷尔、雅伦·戈兰、迪克·哈特、乔·希尔德布兰德、杰夫·霍奇斯、罗斯·霍斯利、埃德蒙·杰伊、特罗·基维宁、本·劳里、特德·莱蒙、詹姆斯·马格尔、马特·米勒、凯瑟琳·莫里亚蒂、托尼·纳达林、希德基·纳拉、阿克塞尔·内内克尔、约翰·帕泽、雷·波尔克、艾曼纽尔·拉维特、,EricRescorla、PeteResnick、JimSchaad、PaulTarjan、HannesTschofenig和SeanTurner。