FirstName/LastNameコンボに基づいてハッシュを作成する必要があります。データベースでは、両方とも最大100文字であり、ハッシュは最大20文字である必要があります。
それに基づいて独自の価値を確実に生み出す方法はありますか?FirstName/LastNameコンボが一意であると想定します。
ハッシュが一意であることが絶対に保証されることはなく、一意の識別子として使用するべきではありません。
実際には、優れた暗号化ハッシュは、それぞれのメッセージとほぼ同じくらい一意です。同じFirstName/LastNameを同じ「一意の」20文字にマップしたい場合、あなたが説明することはSHA -1に非常に似ているようです。完全な SHA-1 は GUID よりも大きく (何かを示しています)、暗号化されているため、かなり均等に分散され、衝突する可能性はほとんどありません (SHA-1 の衝突攻撃を参照してください - 意図的に行うことさえ困難です)。
テーブル内の各レコードに一意の識別子が必要であり、この識別子は簡単に推測できないようです。これを実現するには、次のような複数の方法があります。
1.unique
制約付きの識別子の列を追加し、列の挿入時にランダムな識別子を生成します。識別子がすでに存在するために挿入が失敗した場合は、新しい識別子を生成して再試行してください。
2.auto GUID
テーブルに列を追加して、データベースが一意の識別子を生成できるようにします。
3.auto-increment int
テーブルに列を追加して、データベースが一意の識別子を生成し、それを難読化できるようにします。これを行うには、たとえば、整数を 16 にパディングし、128 ビットのブロック暗号で暗号化します。例:
private static readonly AesManaged cipher = new AesManaged()
{
BlockSize = 128,
Key = Encoding.UTF8.GetBytes("secret__secret__"),
Mode = CipherMode.ECB,
Padding = PaddingMode.None
};
static string Obfuscate(int id)
{
using (var transform = cipher.CreateEncryptor())
{
return Convert.ToBase64String(
transform.TransformFinalBlock(
Encoding.UTF8.GetBytes(
id.ToString("0000000000000000")), 0, 16));
}
}
static int Deobfuscate(string s)
{
using (var transform = cipher.CreateDecryptor())
{
return int.Parse(
Encoding.UTF8.GetString(
transform.TransformFinalBlock(
Convert.FromBase64String(s), 0, 16)));
}
}
これらの方法のいずれも識別子を推測することを不可能にするものではなく、整数を 1 ずつインクリメントするよりも難しいことに注意してください。ユーザーが識別子に関連付けられた情報を表示する権限を持っているかどうかを確認する必要があります。