2

私のチームは、グループ オブジェクトの一意の識別子として 2 つの異なる値を使用するレガシー データベースを使用するアプリケーションに取り組んでいます。これIdは、挿入時にデータベースによって値が決定される自動インクリメント ID 列です。 挿入GroupCodeのアプリケーションによって決定され、 です。"Group" + theGroup.Id

必要なのは、次のような GroupCode を生成するアルゴリズムです。

  1. ユニークです。
  2. ユーザーが正しく入力するのはかなり簡単です。
  3. ハッカーが推測するのは困難です。
  4. 挿入時にデータベースによって作成されるか、挿入前にアプリによって作成されます (つまり、ID 列に依存しません)。

既存のソリューションは最初の 2 つの基準を満たしていますが、最後の 2 つを満たしていません。上記の基準をすべて満たす良い解決策を知っている人はいますか?

もう 1 つ注意: このコードはユーザーによって外部的に使用され、ID は他のテーブルが外部キーをリンクするためのより良い識別子になりますが、GroupCode は他のテーブルで特定のグループを参照するために使用されます。

前もって感謝します。

4

2 に答える 2

1

新しい列を追加することは可能でしょうか? これは、ID とランダムな 32 ビット数で構成できます。

その 64 ビットの数値は、«Memorable Random String» に変換できます。セキュリティ的には完璧ではありませんが、十分な可能性があります。

Ruby とこれむたけ gemを使った例です。

require 'koremu'
# http://pastie.org/96316 adds Array.chunk
identity=104711
r=rand(2**32)<<32 # in this example 5946631977955229696
ka = KoremuFixnum.new(r+identity).to_ka.chunk(3)
ka.each {|arr| print KoremuArray.new(arr).to_ks + " "}

結果:

ツサダ レグルミ レバデ

また、 Phonetically Memorable Password Generation Algorithmsも確認してください。

于 2009-09-14T20:32:52.823 に答える
1

Base32/Base36 コンテンツ エンコーディングを調べましたか? Identity シード列の Base32 表現により、一意になり、簡単に入力できますが、安全ではありません。ただし、ほとんどの非プログラマーは、文字列値がどのように生成されるかわかりません。

また、Base32/36 を使用すると、通常のデータベース整数ベースの主キーを維持できます。

于 2009-09-14T13:16:59.550 に答える