0

のような一意の電話番号0241194000を使用して、電話番号に基づいて PIN コードを生成し、PIN が実際に電話番号から生成されたことを確認または検証する方法も必要です。

Number  : 0241194000                      LENGHT(10)
PIN     : 675436                          LENGHT(6)     ONLY NUMERIC
Checker : 673AA3738SHZXCVDER              ANY LENGTH    ALPHANUMERIC.

リンクやヘルプは素晴らしいでしょう。

4

3 に答える 3

1

ソースセットよりも短い固有の PIN を作成できないという上記の正しいコメントにも関わらず (定義上、決して固有ではないハッシュに要約されます)、「複製できないコード」を意味していると思います。部外者による電話番号であり、電話番号と PIN が与えられれば、関連性があることを証明できますが、同じ PIN が別の電話番号で使用された場合にも有効である可能性があることを受け入れます。」

と仮定すると、最も簡単な解決策は、電話番号からソルト ハッシュを作成することです。サンプル擬似コード:

static uniqueHash = '9t45uufg92dit093ik,96igm0v9m6i09im09i309disl54923';
function createPinFromPhone(string phonenumber)
{
  string pin = '';
  do {
    hash = md5(phonenumber+uniqueHash);
    pin += extractNumbersFromString(hash);
    phonenumber = pin+hash;
  }
  while(pin.length < 6)
  return pin.subString(0, 6);
}

これは、同じ電話番号から常に同じ PIN コードを返す関数の (大まかな) 例であり、一意の秘密鍵を使用することで部外者が決して複製することはできません。理論的にはエントロピーの問題が発生する可能性がありますが、現実的にはこの規模ではありません。

于 2013-05-02T14:54:08.837 に答える
1

あなたが探しているものは、関数によって任意の数値 (x) を PIN に変換できる数学的な全単射関数(できれば複雑な関数) です。

F(Number) = PIN

全単射関数を使用すると、方程式を逆方向に解くことで PIN を検証できます。

http://en.wikipedia.org/wiki/Bijection

例えば:

与えられた関数: F(Number) = Number*2

function GeneratePIN(Number)
    return Number*2
end

function validatePIN(PIN,Number)
    return PIN == Number*2
end
于 2013-05-02T14:41:53.910 に答える
0

電話番号から PIN を作成するだけの場合 (電話番号は一意であり、PIN は必ずしも一意である必要はありません)、CRC32、MD5、SHA1 などの多くのハッシュ関数のいずれかを使用して、必要なバイト数/数値だけです。

ハッシュ関数は通常、元の値を把握するのを難しくするだけであるため(あなたの場合はPINから番号を把握すること)、その逆ではないため、安全にするのは簡単ではないことに注意してください。

于 2013-05-02T14:48:13.767 に答える