23
MD5 暗号化を使用して暗号化すると、この 32 文字の長い文字列が得られ37693cfc748049e45d87b8c7d8b9aacd
ますが、これは常に 23 の間静的です。
私は同じ種類のメカニズムが必要ですが、それは122ff1e4883358b6
32 ではなく 18 文字以下 (: など) の長い文字列を生成する必要があります。
C#でそれを行うにはどうすればよいですか?C#でMD5の短いバージョンはありますか??
23
MD5 暗号化を使用して暗号化すると、この 32 文字の長い文字列が得られ37693cfc748049e45d87b8c7d8b9aacd
ますが、これは常に 23 の間静的です。
私は同じ種類のメカニズムが必要ですが、それは122ff1e4883358b6
32 ではなく 18 文字以下 (: など) の長い文字列を生成する必要があります。
C#でそれを行うにはどうすればよいですか?C#でMD5の短いバージョンはありますか??
@RichieHindleの答えが好きです。ただし、忠実度のより少ないビットを失うことに関心がある場合 (それによって衝突のリスクを減らしたい場合)、MD5 ハッシュによって返された 128 ビット値を取得し、代わりに ASCII85 (Base85 エンコーディングとも呼ばれます) を使用してエンコードすることができます。 16 進数ベースのエンコーディングの。これにより、ハッシュ全体が 20 バイトで得られます (これは必要以上ですが、2 バイトを切り取ることができ、16 進エンコードを使用して得られる 32 バイトのうち 14 バイトを削除するよりもはるかに少ない損失になります)。
編集: Prashant は、20 文字で十分に近いと言い、サンプル コードを求めました。
MD5.ComputeHash 呼び出しから MD5 ハッシュを取得したら、Jeff Atwood の ASCII85 エンコーダーを使用できます。
MD5 m = MD5.Create();
byte[] hash = m.ComputeHash(System.Text.Encoding.ASCII.GetBytes("23"));
Ascii85 encoder = new Ascii85();
encoder.EnforceMarks = false;
string hash85 = encoder.Encode(hash);
Console.Out.WriteLine(hash85);
収量
2ebDPFFZsD?&,r1fX\$,
だからあなたはただ使うことができますhash85
。はencoder.EnforceMarks
、エンコードに ASCII85 に関連付けられている一般的なプレフィックスとサフィックスが含まれていないことを確認します。
必要なだけ MD5 ハッシュを取り、残りを捨てることができます。すべてのビットは等しい値を持っているため、それを行うことと、ネイティブに少ないビットを生成するハッシュ アルゴリズムを使用することに違いはありません。
(セキュリティ上の理由でこれを行う場合は、アルゴリズムに関係なく、ビット数が少ないほどハッシュが解読されやすくなることを覚えておいてください。セキュリティ アプリケーションの外部であっても、ビット数が少ないほど衝突のリスクが高くなります。また、MD5 は比較的安全ではないことに注意してください。日 - SHA-1 または SHA-2 がより安全であると見なされます。)
MD5 は常に 128 ビット ハッシュを作成します。
その他の小さなハッシュタイプ (ウィキペディアから取得)
Fowler-Noll-Vo ハッシュ関数 (32、64、128、256、512、または 1024 ビット)
Jenkins ハッシュ関数 (32 ビット)
MurmurHash (32 または 64 ビット)
Pearson ハッシュ (8 ビット)
ただし、ハッシュの衝突を覚えておいてください
衝突なしで結果を元の値にマップできるようにしたい場合は、ハッシュ関数を使用しません。
小さな 10 進数を難読化された長い文字列に変換することが目的の場合は、マッピング アルゴリズムを考案し、結果をzBase32などでエンコードします。
public string Obfuscate(long x)
{
return ToZBase32(BitConverter.GetBytes(x * 63498398L));
}
public long Deobfuscate(string x)
{
return BitConverter.ToInt64(FromZBase32(x)) / 63498398L;
}
23
にエンコードされ"gmuyaiayyyyyy"
ます。(63498398 は公正なサイコロの目で選ばれます。)
FVNHash を使用する - http://www.codeproject.com/KB/security/FnvHash.aspx
ハッシュの長さは設定できますが、セキュリティ上の理由から使用しないでください。
最短の有用なハッシュ アルゴリズムは md5 です。16 バイト = 128 ビットのハッシュを生成します。Base 64 エンコーディングを使用する場合 ...つまり、1 バイト/文字あたり 6 ビットが有効です。
md5 を 22 文字 (ASCII) に減らすことができるはずです。あなたが持っているのは16進バージョンで、2バイトが実際の1バイトを表します
(b64 によって導入された末尾のパディングを残します)
正当なファイル名に同じものを使用するという追加の利点があります。(もちろん、デフォルトの / および + 文字を、OS のファイル命名規則と衝突しない他の記号に置き換える必要があります。
base64 (/ と + を置き換えることにより) は、ハッシュが特殊文字で URL を台無しにしないようにします。これは、Web サーバーにとって別の意味を持つ可能性があります
ASCII85 は、ファイル名や URL として使用するときに扱いにくい文字を追加します
'37aa3296c523f6c5a7fd2102a9155dcc' (16 進数) (32 バイト)
[55, 170, 50, 150, 197, 35, 246, 197, 167, 253, 33, 2, 169, 21, 93, 204] = (16 バイト)
N6oylsUj9sWn_SECqRVdzA==
私の最終ハッシュ
N6oylsUj9sWn_SECqRVdzAこれは実際には 22 個の ASCII 文字による完全な md5 です
([末尾の 2 つを取り除くことができます = md5 には常に 2 つあり、後でデコードするときにそれらを追加します。また、b64 の + と / の文字を、私が好む他のものに置き換えます -(ダッシュ) と _ (アンダースコア) ]
この 32 文字の長い文字列は、16 進数の数値です: 0-f 16 進数値を 36 の基数に変換することで短くすることができます: 0-z