パスワード
認証方式のひとつ
サーバサイドでは復元できないように保存する
ユーザアカウントの保護の他、秘密鍵の保護などでも使われるのでそれぞれ標準的なものがある
8文字までをパスワード、それ以上をパスフェーズという分け方も過去にあったかもしれない
/etc/shadow で使われていた Modular Crypt Format が(ユーザ用)保存形式としては主流
https://qiita.com/ockeghem/items/d7324d383fb7c104af58
秘密鍵などのパスワード保護はPKCS #8 やPKCS #12 に PKCS #5 のPBES2などをかけ?
ダイジェスト(ハッシュ)を利用するが、MD5, SHA-1などは廃止されているのでパスワード専用のアルゴリズムや最低でもSHA-2、SHA-3とかどう?
他の認証手段へ
よく漏れる
単純なハッシュ化などでも漏れやすい
単純なパスワードを利用すると複雑な暗号化でも無意味
使える文字 (目安)
英数記号
ASCII 0x21 から 0x7e ぐらい
まともなところはUnicode文字を使ってもよい
PRECIS Framework RFC 8265で利用できる文字などの規定あり
RFC 8265 Preparation, Enforcement, and Comparison of Internationalized Strings Representing Usernames and Passwords
ユーザー名とパスワードを表す国際化文字列の準備、適用、比較
https://tex2e.github.io/rfc-translater/html/rfc8265.html
https://datatracker.ietf.org/doc/html/rfc8265
RFC 7613 → 8265
他の手法 (推奨)
公開鍵認証 (SSHなど、ブラウザでもPKI認証できるよ)
WebAuthn
Passkey (Webブラウザ)
物理鍵
あまり使われないHTTP認証
RFC 7616 HTTP Digest Access Authentication
RFC 7617 The 'Basic' HTTP Authentication Scheme
RFC 7235 Hypertext Transfer Protocol (HTTP/1.1): Authentication
RFC 8120 Mutual Authentication Protocol for HTTP
照合
TLSなどで経路が暗号化されている前提では上のような方法が取れる
パスワード相当のもの
セッションID、APIのもの、などは制限付きのそんなかんじ
ハッシュ値を攪拌するためのものは鍵やパスワードではなくsalt (塩)という
WebのAPI利用では nonce という使い捨ての乱数コードなどもある
変更
Well-known URIのchange-password で変更できるらしい
https://w3c.github.io/webappsec-change-password-url/#the-change-password-well-known-uri
Xなどが対応?
plane 暗号化なし (禁止)
単純なハッシュ, ソルトなど (禁止)
MD5
SHA-256
SHA-512
など
アカウント用
Modular Crypt Format
DEScrypt
md5_crypt
bcrypt(72文字制限あり)
scrypt
Argon2
Argon2i
Argon2d
Argon2id
SHA-crypt
sha256_crypt
sha512_crypt
など
SASL
RFC 7677 scram-sha-256 scram-sha-256-plus
RFC 8265 Preparation, Enforcement, and Comparison of Internationalized Strings Representing Usernames and Passwords
暗号用
PKCS #5
PBES2 パスワード→ブロック暗号・ストリーム暗号
PBKDF2 パスワード→暗号鍵
PBMAC1 パスワード→MAC
クライアントサイドの暗号化
暗記?
平文を保存(他の方式を検討する)
PBES2など?
パスワード管理ツール