ユーザーがユーザー名とパスワードを登録する必要があるウェブサイトの開発を計画しています。ユーザーにパスワードを選択させる場合、ユーザーがパスワードに含めることができる文字は何ですか? httpプロトコルまたは実装言語のセキュリティ問題のために、私がしてはいけないことはありますか?
実装言語はまだ決めていませんが、Linuxを使用します。
セキュリティ/実装の観点から、 '\ 0'(とにかく入力が難しい)以外の文字を禁止する必要はありません。禁止する文字が多いほど、考えられるパスワードのフェーズスペースの合計が小さくなり、パスワードの総当たりが速くなります。もちろん、ほとんどのパスワード推測では、入力ドメインの体系的な検索ではなく、実際には辞書の単語が使用されます...
ただし、sabilityの観点からは、一部の文字は異なるマシンで同じように入力されません。例として、ここには2つの異なるコンピューターがあり、shift-3は一方に#を生成し、もう一方に£を生成します。パスワードを入力すると、どちらも「*」と表示されるため、正しく入力したかどうかはわかりません。一部の人々は、それが人々を混乱させ、それらのキャラクターを許可しないようにし始めると思うかもしれません。やる価値はないと思います。ほとんどの実在の人々は、1台または2台のコンピューターから実際のサービスにアクセスし、多くの拡張文字をパスワードに含める傾向はありません。
非ASCII文字に問題がある可能性があります。パスワードはグリフのシーケンスですが、パスワード処理(ハッシュ)はビットのシーケンスを必要とするため、グリフをビットに変換する確定的な方法が必要です。これは コードページ の全体のあいまいな沼です。 nicode を使用しても、問題が発生します。
1つの文字は、コードポイントとして複数の分解を持つことができます。たとえば、「é」文字(フランス語では非常に頻繁に使用されます)は、単一のコードポイントU + 00E9またはシーケンスU + 0065 U + 0301のいずれかとしてエンコードできます。両方のシーケンスは同等であることを意味します。どちらを取得するかは、入力デバイスで使用される規則によって異なります。
Unicode文字列は、一連のコードポイントです(0から1114110の範囲の整数です)。そのようなシーケンスをバイトに変換するためのいくつかの標準エンコーディングがあります。最も一般的なのは、UTF-8、UTF-16(ビッグエンディアン)、UTF-16(リトルエンディアン)、UTF-32(ビッグエンディアン)、UTF-32(リトルエンディアン)です。 [〜#〜] bom [〜#〜] で始まるものとそうでないものがあります。
したがって、単一の「é」は、少なくとも20の異なるバリアントを持つバイトに有意義にエンコードできます。これは、「主流のUnicode」に固執する場合です。 Latin-1エンコーディング 、またはその Microsoft対応 も普及しているため、21にしてください。特定のソフトウェアで使用するエンコーディングは、多くの要因に依存します。 locale を含めます。ユーザーが構成を「カナダ-英語」から「カナダ-フランス語」に切り替えたために自分のコンピューターにログオンできなくなった場合、それは煩わしいことです。
実験的に、その種類のほとんどの問題は、パスワードを printable ASCII文字の範囲に制限することで回避されます。 (32から126の範囲のコードを持つもの-個人的にはスペースを避けるので、それを33から126)にし、モノバイトエンコーディング(BOMなし、1文字は1バイトになります。パスワードは視覚的なフィードバックなしでさまざまなキーボードで入力することを目的としているため、最適な使いやすさのために文字のリストをさらに制限する必要があります(私は カナダのレイアウト と毎日戦います)キーボードで書かれたものは、特に1つまたは2つのネストされた RDP接続 を通過するときに、マシンが想定しているものと必ずしも一致しません。「<」、「>」、および「\」の文字はほとんどの場合移動します文字)(大文字と小文字)と数字だけで問題ありません。
ユーザーが責任を負っていると言えます。タイピングの問題に対処する限り、彼は好きな文字を自由に使用できます。しかし、それは最終的には妥当ではありません。ユーザーが問題を抱えている場合、ユーザーはyourヘルプデスクに電話をかけ、あなたは彼らの過ちの一部を引き受けなければなりません。
生成中ランダムなパスワードの場合は、他のユーザーと混同される可能性のある文字を避けることをお勧めします。例(シンボルは無視):
l, o
I, O
1, 0
すべての文字を許可することに加えて、パスワードにパスフレーズを使用する人々をサポートするために、パスワードフィールドに非常に寛大な最大長を設定することを検討してください。
「私のパスワードはすべて小文字です」という語句は、その長さのため実際には妥当な強力なパスフレーズです。
文字を禁止しないでください。パスワードが6文字より短くならないようにする可能性があります。そして、パスワードをハッシュするために bcryptを使用 を実行する必要があります。
問題を引き起こす可能性のある文字がいくつかあります。
* 、?および%:これらはワイルドカードとしてよく使用されるため、基礎となるプログラミング言語を混乱させる可能性があります。
Tab、Return、NewLine、Vertical Tab、Escape:このような特殊文字は、プログラミング言語からの奇妙な動作を要求する可能性がありますORお客様が使用するブラウザーからの場合(お客様が複数の異なるブラウザーを使用している場合、これらの入力を許可し、別のブラウザは許可しない可能性が非常に高いです。そのブラウザで顧客をアカウントから事実上ロックアウトします。)
\は、特別な意味に従う文字を与えるエスケープ文字として扱われることがよくあります。
例えば。 「\ n」は多くの場合改行です。 「\ t」はタブです。
プログラミング言語(または顧客のブラウザー)がこれを行うと、上記の文字を受け取る可能性に戻ります。
したがって、安全のためだけに\を完全に禁止するのがおそらく最善です。
「仮想キーボード」または類似のツールが利用可能でない限り、文字が統一された方法で生成されると考えられるのは、英数字のみです。残りのすべての場所は、キーボードによって異なる場合があります。ユーザーが別の場所からサービスにアクセスする必要がある場合、サービスから効率的にロックすることができます。
私は仮想キーボードを使用して、どのシステム/キーボード/何が使用されているかに関係なく、同じ方法でまったく同じ文字表現(すでに上記のUnicodeについて説明されています)を送信する方法としてお勧めします。したがって、キーワードに入力できる文字を除外する必要はありません。