2016-05-05 26 views
0

文字列から一意の番号を生成したいと思います。文字列は、ユーザー名とパスワードの組み合わせです。この組み合わせから一意の番号ID(文字列ではない)を生成したいと思います。私は最初に組み合わせをmd5してから番号に変換します。番号の長さは10にする必要があります。node.jsの文字列から一意の番号を生成する方法

+0

なぜ数値でなければならないのですか? db identity列の値を使用しますか? –

+0

ここでは正確に何を構築しようとしていますか? – Thomas

+0

原因サードパーティのサービスでは番号である必要があります。 –

答えて

0

これは非常に奇妙な要求であり、根本的な欠陥が含まれているため、あなたが接続しようとしているサードパーティについてより詳細な情報を提供できれば最適です。数字はユニークであることを尋ねますが、10桁の数字(10進数)または100億の可能な値のみを許可しています。

これは非常に多くのように聞こえるが、実際はそうではありません。これにより、33ビットをわずかに超えるハッシュ値が得られます。 http://davidjohnstone.net/pages/hash-collision-probabilityの単純なハッシュ衝突確率計算機では、わずか100,000エントリで44%の衝突の可能性があります。しかし、それは利用可能なすべての入力文字の完全な使用を前提としています。ユーザー名とパスワードの組み合わせはほとんどの場合アルファベットや数字に限定されているため、実際の衝突の可能性ははるかに悪いです(これらのフィールドに許可する文字を知らなくても計算できませんが、悪いです)。

NodeJSは、cryptoモジュールに多数の暗号化機能を提供します。理想的なケースのSHA *オプションを含む、ハッシュ関数の全セットが利用可能です。これらは、天体衝突の確率で安全で不可逆なハッシュを提供するために使用できます。

これらのオプションを使用できない場合は、基本的な設計上の欠陥があることをお勧めします。ほとんどの場合、リモートシステムのユーザーIDとパスの組み合わせをマッピングすることは、モデル内で高い衝突リスクがあるため、簡単なブルートフォース攻撃で攻撃者が簡単に妥協する方法で見つけることができます。

あなたがやっていると思っていることをしているなら、これを行う「正しい」方法は、サーバ上のどこかにシンプルなデータベースを置くことです。ユーザー/パスには一意のIDが割り当てられますが、これは何であるかは関係ありません。単一のMySQLテーブルの自動インクリメントIDフィールドになる可能性があります。サーバーは、必要なAPI呼び出しのID値でこのリモートサービスに接続し、結果をユーザーに返します。これにより、ユーザー名/パスワードが実際にハッシュされず、保存され、毎回100%確認できるため、セキュリティ上のリスクが排除されます。

ハッシュをプライマリデータ値として使用しないでください。それは単純化であり、それ自体では本当の価値ではありません。