PRECIS 知ってますか?

昨今 ID 管理系の業務をやっていて、まあ色々学びがあるんですがそのうちのひとつ、PRECIS について。

PRECIS というのは RFC 8264 で規定される、ユニコード文字列を適正に比較するためのフレームワークです。 PReparation, Enforcement, and Comparison of Internationalized Strings の acronym で PRECIS と呼ばれています。

ユニコードは表示上は同じように見えても UTF-8 のバイト列としては異なる表現になる文字列があったりします。 たとえば「が」は 0xE3 0x81 0x8C もしくは 0xE3 0x81 0x8B 0xE3 0x82 0x99 のどちらかで表現可能です。 当然、単純にバイト列として比較してしまうと同じ文字列なのに異なるという誤判定をしてしまいます。

ここまでは NFC とか NFD といった normalization の話なのですが、PRECIS はそれに加えてユーザー名やパスワードに使えない文字列を除外したりする規則を定めています。 具体的な規則を PRECIS profile と呼んでいて、RFC 8265 では以下の3つが規定されています。

  • UsernameCaseMapped: 大文字小文字を区別しない、ユーザー名用プロファイル。空白文字などは弾かれます。
  • UsernameCasePreserved: 大文字小文字を区別する(以下略)
  • OpaqueString: パスワード用プロファイル。大体の文字は大丈夫だが、コントロールキャラクターとかは弾かれます。

この PRECIS はシステム間でユーザー情報を同期する SCIM などのプロトコルでも採用されているため、新規に ID 管理を実装するならユーザー名やパスワードが PRECIS profile に準拠しているかチェックするようにしておくと、ちょっと相互連携しやすくなるかなと思います。そういうのがなくても、適切に正規化したり不適当な文字を弾いてくれるので使っておくのが安心です。

Go であれば golang.org/x/text/secure/precis パッケージで利用できるようになっています。

以上