* [CODE[HashAlgorithm]] (TLS)

[REFS[
- [43] [CITE@en[RFC 5246 - The Transport Layer Security (TLS) Protocol Version 1.2]] ([TIME[2015-03-25 03:49:56 +09:00]] 版) <https://tools.ietf.org/html/rfc5246#section-12>
]REFS]

* ダイジェストアルゴリズム (HTTP)

** 仕様書

[REFS[
- [21] [CITE@en[RFC 3230 - Instance Digests in HTTP]] ([TIME[2014-08-31 18:57:37 +09:00]] 版) <http://tools.ietf.org/html/rfc3230#section-4.1.1>
- [28] [[RFC 5843]] [CITE@en[Additional Hash Algorithms for HTTP Instance Digests]]
([[IETF情報提供RFC]]) <http://tools.ietf.org/html/rfc5843>
- [25] [CITE[Hypertext Transfer Protocol (HTTP) Digest Algorithm Values]] ([TIME[2014-01-31 02:45:29 +09:00]] 版) <http://www.iana.org/assignments/http-dig-alg/http-dig-alg.xhtml>
-- [30] 旧 [CITE[HTTP Digest Algorithm Values]] 
<http://www.iana.org/assignments/http-dig-alg>
]REFS]

** 識別

[22] [[ダイジェストアルゴリズム]]の名前は、[[字句]]です [SRC[>>21]]。
[[大文字・小文字不区別]]です [SRC[>>21]]。

[FIG(railroad)[
= [[字句]]
]FIG]

[23] [[アルゴリズム]]によっては、[[引数]]を加えて指定する必要があるかもしれません [SRC[>>21]]。

;; 構文は[[引数 (HTTP)]] [SRC[>>21]] 参照。

;; [36] 実際には定義されている[[ダイジェストアルゴリズム]]はいずれも[[引数]]を使っていませんし、[[引数]]を指定する構文も用意されていないようです。

[27] [[ダイジェストアルゴリズム]]名によって識別される[[符号化]]は、
[[引用文字列]]として表されるものか、 [CODE(HTTP)[[[;]]]] や [CODE(HTTP)[[[,]]]]
を使わないものかのいずれかでなければ[['''なりません''']] [SRC[>>25]]。

** 文脈

[34] [[ダイジェストアルゴリズム]]の名前と[[符号化]]された値は、
[[実現値ダイジェスト]]で使われます。

[35] [[ダイジェストアルゴリズム]]の名前は [CODE(HTTP)@en[[[Want-Digest:]]]]
[[ヘッダー]]でも使われます。

** ダイジェストアルゴリズムの一覧

[24] 次の[[ダイジェストアルゴリズム]]名があります。
[FIG(short list)[
- [CODE(HTTP)@en[[[ADLER32]]]]
- [CODE(HTTP)@en[[[contentMD5]]]]
- [CODE(HTTP)@en[[[CRC32c]]]]
- [CODE(HTTP)@en[[[HMAC-MD5]]]]
- [CODE(HTTP)@en[[[HMAC-SHA-1]]]]
- [CODE(HTTP)@en[[[MD5]]]]
- [CODE(HTTP)@en[[[SHA]]]]
- [CODE(HTTP)@en[[[SHA-256]]]]
- [CODE(HTTP)@en[[[SHA-512]]]]
- [CODE(HTTP)@en[[[UNIXcksum]]]]
- [CODE(HTTP)@en[[[UNIXsum]]]]
]FIG]

[26] [[IANA登録簿]]が用意されています [SRC[>>25]]。

;; [40] >>39/>>44 に [[JSON]] 形式の一覧データファイルがあります。
[REFS[
- [39] [CITE@en[data-web-defs/digests.txt at master · manakai/data-web-defs]] ([TIME[2015-01-10 13:12:02 +09:00]] 版) <https://github.com/manakai/data-web-defs/blob/master/doc/digests.txt>
- [44] [CITE@en[data-web-defs/digests.json at master · manakai/data-web-defs]] ([TIME[2015-06-18 17:28:10 +09:00]] 版) <https://github.com/manakai/data-web-defs/blob/master/data/digests.json>
]REFS]

** 歴史

[FIG(quote)[
[FIGCAPTION[
[29] RFC 3230 (実現値要約) 4.1.1 Digest algorithms
]FIGCAPTION]

>   Digest algorithm values are used to indicate a specific digest
computation.  For some algorithms, one or more parameters may be supplied.

要約算法値は特定要約計算を示すために使用します。
算法によっては、一つ以上の引数を供給するかもしれません。

>
-      digest-algorithm = token

>   The BNF for "parameter" is as is used in RFC 2616 [4].  All digest-algorithm values are case-insensitive.

[CODE(ABNF)[[[parameter]]]] の [[BNF]] は [[RFC 2616]]
で使われているものの通りです。すべての [CODE(ABNF)[digest-algorithm]]
値は大文字・小文字を区別しません。

>   The Internet Assigned Numbers Authority (IANA) acts as a registry for
digest-algorithm values.  Initially, the registry contains the
following tokens:

インターネット割り当て番号事務局 ([[IANA]])
が [CODE(ABNF)[digest-algorithm]] 値の登録簿として働きます。
最初に、登録簿は次の字句を含みます。

>
:   MD5               :
The MD5 algorithm, as specified in RFC 1321 [15].
The output of this algorithm is encoded using the
base64 encoding [1].
:   SHA               :
The SHA-1 algorithm [12].  The output of this
algorithm is encoded using the base64 encoding [1].
:   UNIXsum           :
The algorithm computed by the UNIX "sum" command,
as defined by the Single UNIX Specification,
Version 2 [13].  The output of this algorithm is an
ASCII decimal-digit string representing the 16-bit
checksum, which is the first word of the output of
the UNIX "sum" command.
:   UNIXcksum         :
The algorithm computed by the UNIX "cksum" command,
as defined by the Single UNIX Specification,
Version 2 [13].  The output of this algorithm is an
ASCII digit string representing the 32-bit CRC,
which is the first word of the output of the UNIX
"cksum" command.

: [CODE(HTTP)[[[MD5]]]] : [[RFC 1321]] で規定されている MD5 算法。
この算法の出力は [[base64]] 符号化を使って符号化する。
: [CODE(HTTP)[[[SHA]]]] : SHA-1 算法。この算法の出力は
base64 符号化を使って符号化する。
: [CODE(HTTP)[[[UNIXsum]]]] : [[単一UNIX仕様書]]第2版で定義されている
[[UNIX]] [KBD[[[sum]]]] 命令で計算される算法。
この算法の出力は16ビット検査和を表現する [[ASCII]]
十進数文字列で、 UNIX [KBD[sum]] 命令の出力の最初の語である。
: [CODE(HTTP)[[[UNIXchecksum]]]] : 単一 UNIX 仕様書第2版で定義されている
UNIX [KBD[[[cksum]]]] 命令で計算される算法。
この算法の出力は32ビット [[CRC]] を表現する [[ASCII]]
数値文字列で、 UNIX [KBD[cksum]] 命令の出力の最初の語である。

>   If other digest-algorithm values are defined, the associated encoding
MUST either be represented as a quoted string, or MUST NOT include
";" or "," in the character sets used for the encoding.

他の [CODE(ABNF)[digest-algorithm]] 値が定義される時は、
関連付けられる符号化は[[引用文字列]]として表現されるものであるか、
もしくは符号化に用いられる[[文字集合]]中に [CODE(char)[[[;]]]]
または [CODE(char)[[[,]]]] を含んでは'''ならない'''かでなければ'''なりません'''。
]FIG]

[FIG(quote)[
[FIGCAPTION[
[31] RFC 3230 6 IANA Considerations
]FIGCAPTION]

> The Internet Assigned Numbers Authority (IANA) administers the name
space for digest-algorithm values.  Values and their meaning must be
documented in an RFC or other peer-reviewed, permanent, and readily
available reference, in sufficient detail so that interoperability
between independent implementations is possible.  Subject to these
constraints, name assignments are First Come, First Served (see RFC 2434 [11]).

インターネット割り当て番号事務局 ([[IANA]])
は [CODE(ABNF)[[[digest-algorithm]]]] 値の名前空間を管理します。
値とその意味は、 [[RFC]] または他のよく評価された、持続的で、
既に入手可能な参照物で、独立な実装が相互運用可能である程度十分詳細に文書化されていなければなりません。
この制約の元、名前割り当ては[[先来先給]]とします
([[RFC 2434]] を参照)。
]FIG]

[32] [[IANA登録簿]]には [Q[(last updated 2002-01-14)]] の時点では [[RFC 3230]]
の4種類のみ登録されていました。

[33] その後 [[RFC 5843]] によって [CODE(HTTP)@en[[[MD5]]]] と [CODE(HTTP)@en[[[SHA]]]]
の定義が更新されると共に、 [CODE(HTTP)@en[[[SHA-256]] と [CODE(HTTP)@en[[[SHA-512]]]]
が追加されています [SRC[>>28]]。

* ダイジェストアルゴリズム (HTTP ダイジェスト認証)

** 仕様書

[REFS[
- [45] [CITE@en[RFC 7616 - HTTP Digest Access Authentication]] ([TIME[2015-11-10 07:05:08 +09:00]] 版) <https://tools.ietf.org/html/rfc7616#section-3>
-- [50] [CITE@en[RFC 7616 - HTTP Digest Access Authentication]] ([TIME[2015-11-10 07:05:08 +09:00]] 版) <https://tools.ietf.org/html/rfc7616#section-3.3>
-- [64] [CITE@en[RFC 7616 - HTTP Digest Access Authentication]] ([TIME[2015-11-10 07:05:08 +09:00]] 版) <https://tools.ietf.org/html/rfc7616#section-3.4>
-- [66] [CITE@en[RFC 7616 - HTTP Digest Access Authentication]] ([TIME[2015-11-10 07:05:08 +09:00]] 版) <https://tools.ietf.org/html/rfc7616#section-3.7>
-- [72] [CITE@en[RFC 7616 - HTTP Digest Access Authentication]] ([TIME[2015-11-10 07:05:08 +09:00]] 版) <https://tools.ietf.org/html/rfc7616#section-6.1>
- [70] [CITE[Hypertext Transfer Protocol (HTTP) Digest Algorithm Values]] ([TIME[2015-10-03 07:34:45 +09:00]] 版) <http://www.iana.org/assignments/http-dig-alg/http-dig-alg.xhtml#hash-alg>
]REFS]

** アルゴリズム

[46] 次の[[ダイジェストアルゴリズム]]があります。
[FIG(table)[
:a: [[アルゴリズム]]
:v: 通常の値
:s: [CODE[-sess]] 値

:a: [[SHA-256]] [SRC[>>45]]
:v: [CODE[[[SHA-256]]]] [SRC[>>72]]
:s: [CODE[[[SHA-256-sess]]]]

:a: [[SHA-512/256]] [SRC[>>45]]
:v: [CODE[[[SHA-512-256]]]] [SRC[>>72]]
:s: [CODE[[[SHA-512-256-sess]]]]

:a: [[MD5]] [SRC[>>45]]
:v: [CODE[[[MD5]]]] [SRC[>>72]]
:s: [CODE[[[MD5-sess]]]]
]FIG]

[67] [[SHA-256]] を実装しなければなりません [SRC[>>66]]。

[47] [[MD5]] を使う[['''べきではありません''']] [SRC[>>45]]。

[HISTORY[
[68] [[RFC 2617]] までは [[MD5]] しかありませんでした。
]HISTORY]

;; [69] [[折衝]]については、 [[challenge]] を参照。

[71] [[IANA登録簿]]があります [SRC[>>70, >>72]]。 [CODE[-sess]]
付きの名前はすべてのアルゴリズムに存在し、 [[IANA登録簿]]には登録されません [SRC[>>72]]。

;; [73] 明記されていませんが、元から [CODE[-sess]] がついている[[ダイジェストアルゴリズム]]名は禁止されているものと思われます。

[HISTORY[
[74] [[IANA登録簿]]は [[RFC 7616]] で新設されました。
]HISTORY]

[75] 値は[[ASCII大文字・小文字不区別]]です。

;; [76] [[RFC 7616]] はそのことをまったく説明していません。(ひどい話です。)
[[RFC 2617]] は当時の唯一の[[アルゴリズム]]である [[MD5]]
に関しては [[ABNF]] で[[大文字・小文字不区別]]であることを示していました [SRC[>>49]]。

** [CODE(HTTP)@en[algorithm]] 引数

[51] [DFN[[CODE(HTTP)@en[[[algorithm]]]]]] [[引数]]は、
[[digest]] や [[unkeyed digest]] を生成するのに使う[[アルゴリズム]]を示します
[SRC[>>50]]。

[60] [CODE(ABNF)@en[[[auth-param]]]] 
の[[引用文字列]]構文を使っては[['''なりません''']] [SRC[>>50, >>64]]。

[54] 値は[[アルゴリズム]]名です。各[[アルゴリズム]]について、
「non-Session variant」を表す通常の値 (例えば [CODE[SHA-256]]) と
「Session variant」を表す [CODE[-sess]] 付きの値 (例えば [CODE[SHA-256-sess]])
があります [SRC[>>50]]。

;; [59] [CODE[-sess]] は、第三者認証サーバーを効率的に実現するためのものです [SRC[>>50]]。

[55] [[ダイジェスト認証]]の [[challenge]] [SRC[>>50]] や
[[credentials]] [SRC[>>64]] で使うことができます。

[65] [[credentials]] には、 [[challenge]] と同じ値を指定しなければなりません [SRC[>>64]]。

[52] [CODE(HTTP)@en[[[algorithm]]]] [[引数]]が存在しなければ、
[CODE[[[MD5]]]] とみなします [SRC[>>50]]。

[53] 未知の値であれば、 [[challenge]] を無視する[['''べきです''']] [SRC[>>50]]。

[62] [CODE[[[response]]]] [[引数]]や [CODE[[[username]]]]
[[引数]]の値の計算に使われます。

** 関数 [CODE[[VAR[KD]] ()]] と関数 [CODE[[VAR[H]] ()]]

[56] データ[VAR[データ]]と秘密[VAR[秘密]]について、 
(unkeyed digest [[アルゴリズム]][VAR[アルゴリズム]]に関する [CODE[[VAR[[[H]]]] ()]]
を使った)
[DFN[[CODE[[ABBR[[VAR[KD]]][Keyed Digest]]([VAR[[RUBYB[データ]@en[data]]]], [VAR[[RUBYB[秘密]@en[secret]]]])]]]]
とは、次の操作をいいます [SRC[>>50]]。
[FIG(steps)[
= [57] [VAR[入力]]を、[VAR[秘密]]、[CODE[:]]、[VAR[データ]]をこの順に連結した列とします。
= [58] [VAR[H]] ([VAR[入力]]) を返します。
]FIG]

[61] 入力[VAR[入力]]について unkeyed digest [[アルゴリズム]][VAR[アルゴリズム]]の
[CODE[[DFN[[VAR[H]]]] ([VAR[入力]])]] とは、
[VAR[入力]]に[VAR[アルゴリズム]]を適用した結果を返す操作をいいます [SRC[>>50]]。

[63] これらの[[関数]]は、 [CODE[[[response=""]]]] [[引数]]や
[CODE[[[rspauth=""]]]] [[引数]]の値の計算に使われます。

** 歴史

[REFS[
- [48] [CITE@en[RFC 2069 - An Extension to HTTP : Digest Access Authentication]] ([TIME[2012-02-26 10:05:21 +09:00]] 版) <http://tools.ietf.org/html/rfc2069#page-6>
- [49] [CITE@en[RFC 2617 - HTTP Authentication: Basic and Digest Access Authentication]] ([TIME[2012-01-09 21:04:30 +09:00]] 版) <http://tools.ietf.org/html/rfc2617#section-3.2.1>
]REFS]

* ハッシュ ([CODE(URI)@en[ni:]], [CODE(URI)@en[nih:]] URL)

** 仕様書

[REFS[
- [3] [CITE@en[RFC 6920 - Naming Things with Hashes]] ([TIME[2014-06-02 05:17:24 +09:00]] 版) <http://tools.ietf.org/html/rfc6920#page-5>
- [12] [CITE@en[RFC 6920 - Naming Things with Hashes]] ([TIME[2014-06-02 05:17:24 +09:00]] 版) <http://tools.ietf.org/html/rfc6920#section-9.4>
- [20] [CITE[Named Information]] ([TIME[2014-01-30 17:45:21 +09:00]] 版) <http://www.iana.org/assignments/named-information/named-information.xhtml#hash-alg>
]REFS]

** 識別

[13] [[ハッシュアルゴリズム]]は [[IANA]] に登録することになっています [SRC[>>12, >>20]]。

[14] [[ハッシュアルゴリズム]]には名前が付けられます。名前は [[URL]]
の構文上は1文字以上の [[RFC 3986]] [CODE(ABNF)@en[[[unreserved]]]] とされていますが、
登録手続き上は制限がありません。 名前は、 [CODE(URI)@en[[[ni:]]]] と
[CODE(URI)@en[[[nih:]]]] で使います。

;; [15] 登録済みの名前はすべて[[ASCII小文字]]と
[[ASCII数字]]と [CODE[[[-]]]] で構成されています。
明記されていませんが大文字と小文字は区別していそうです。

;; [16] [[Suite ID]] と構文的に区別できるためには、
少なくても63以下の[[整数]]と一致する[[数字]]のみの列の名前が登録されることはなさそうです。

[17] また、 [[Suite ID]] を割り当てられることもあります。これは 0 から 63
までの[[整数]]です。 [SRC[>>12]] [[Suite ID]] は [CODE(URI)@en[[[nih:]]]]
[[URL]] と、[[バイナリ表現]]で使います。

;; [18] 割り当てられないこともあるようですが、既存のものはすべて割り当てられています。

;; [19] いくつかの [[Suite ID]] は予約されています。

;; [41] >>42 に [[JSON]] 形式の一覧データファイルがあります。
[REFS[
- [42] [CITE@en[data-web-defs/digests.txt at master · manakai/data-web-defs]] ([TIME[2015-01-10 13:12:02 +09:00]] 版) <https://github.com/manakai/data-web-defs/blob/master/doc/digests.txt>
]REFS]

** アルゴリズム

[5] [CODE[[[sha-256]]]] を実装し[['''なければなりません''']] [SRC[>>3]]。

[6] それ以外も実装して構いません [SRC[>>3]]。

[7] [[truncated hash]] も実装して構いません [SRC[>>3]]。

;; [8] [[truncated hash]] には、 truncate されていないものと別のアルゴリズム名が与えられています。

** 入力

[9] [[ハッシュアルゴリズム]]への[[入力]]が[[公開鍵]]の値の時は、
[[X.509]] [CODE[[[SubjectPublicKeyInfo]]]] 構造の[[公開鍵]]に対して[[ハッシュ]]を計算する[['''べきです''']]
[SRC[>>3]]。

;; [10] これは主として [[DANE TSLA]] [[プロトコル]]との互換性のために選ばれました。

[11] [[公開鍵]]以外については、何を[[入力]]として使うかは定義されておらず、
[[応用]]依存とされています [SRC[>>3]]。

** 比較

[4] [[ハッシュ値URLの比較]]を参照してください。

* 参照元 (URL や HTML のリンク) にハッシュ値を埋め込む提案と失敗の歴史

[85] [CODE[ni:]], [CODE[nih:]]

[84] 
[CODE[hash:]],
[CODE(URI)@en[hashed:]]

[83] [[SRI]]

[86] [[Hashlink]]

* メモ

[1]
[CITE[スラッシュドット ジャパン | MD4/MD5 コリジョンの実証コードが公開]] <http://slashdot.jp/security/05/11/18/0125251.shtml>
([[名無しさん]] [WEAK[2005-11-18 09:36:28 +00:00]])

[2] [CITE[Hash Function FAQ]]
( ([TIME[2008-10-18 14:36:30 +09:00]] 版))
<http://burtleburtle.net/bob/hash/hashfaq.html#unique>

[37] [CITE@en[Instance Digests in HTTP (RFC3230)]]
( ([[Anthony Bryan]] 著, [TIME[2009-09-29 15:27:35 +09:00]] 版))
<http://lists.w3.org/Archives/Public/ietf-http-wg/2009JulSep/0872.html>

[38] [CITE@en[Re: ''''''[''''''SRI'''''']'''''' Getting sha-384 and sha-512 added to the RFC6920 registry?]]
( ([[Brad Hill]] 著, [TIME[2015-01-10 05:30:21 +09:00]] 版))
<http://lists.w3.org/Archives/Public/public-webappsec/2015Jan/0114.html>

[FIG(quote)[
[FIGCAPTION[
[77] [CITE@en[XProc 2.0: Standard Step Library]]
([TIME[2016-07-21 14:39:32 +09:00]])
<https://www.w3.org/TR/2016/NOTE-xproc20-steps-20160721/#c.hash>
]FIGCAPTION]

> The value of the algorithm option must be a QName. If it does not have a prefix, then it must be one of the following values: “crc”, “md”, or “sha”.

]FIG]


[FIG(quote)[
[FIGCAPTION[
[78] [CITE[Yocto Project Development Tasks Manual]]
([TIME[2017-11-20 17:32:58 +09:00]])
<http://www.yoctoproject.org/docs/current/dev-manual/dev-manual.html#new-recipe-single-c-file-package-hello-world>
]FIGCAPTION]

>      LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
> 

]FIG]


[79] [CITE@en[Merge pull request #1671 from w3c/hash-func-registry]]
([[alvestrand]]著, [TIME[2017-12-01 00:24:11 +09:00]])
<https://github.com/w3c/webrtc-pc/commit/3f71abd79f96d2c3f72454707c8f239b6ce0735a>

[80] [CITE@en[Editorial: Add IANA-HASH-FUNCTION reference by adam-be · Pull Request #1671 · w3c/webrtc-pc]]
([TIME[2017-12-02 00:11:02 +09:00]])
<https://github.com/w3c/webrtc-pc/pull/1671>

[81] [CITE@en[Point to the Hash Function Textual Names registry · Issue #1663 · w3c/webrtc-pc]]
([TIME[2017-12-02 00:12:09 +09:00]])
<https://github.com/w3c/webrtc-pc/issues/1663>

[82] [CITE@en[WebSub]]
([TIME[2018-01-23 01:01:39 +09:00]])
<https://w3c.github.io/websub/#recognized-algorithm-names>