私は顧客IDの暗号化を必要とするプロジェクトを持っています。暗号化された値は、ウェブサイトのクエリ文字列値として使用され、完成したパーソナライズされたフォームが返されます。
私が抱えている問題は、私たちが扱っているウェブサイトには、英数字以外の文字をクエリー文字列から拒否するセキュリティポリシーがあることです。
私は現在どの文字がブロックされているかを確かめようとしていますが、理想的な解決方法は英数字の文字列を返す暗号化アルゴリズムを使うことです。
私はこのようなアルゴリズムをシステムに見いださなかった。Security.Cryptographyの名前空間はまだ明らかです - 鍵のサイズは一般的に64ビットか何倍かであるためですが、このようなアルゴリズムが利用可能であることを期待しています。
この段階での唯一の選択肢は、他の許可されている文字と違法とみなされる文字はどれでも許容されますが、これを動作させるのに十分な文字があるとは思いません。
このことに関する何か経験や進め方に関する提案はありますか?
回答:
回答№1は2あなたは、任意のバイト(暗号化アルゴリズムの出力)と許容セット内の文字との間の可逆マッピングを作成するだけで済みます。
Base64はこのように動作します - それはセット内の文字に任意のバイナリをエンコードします [A-Za-z0-9+/]
(これはほぼ正確にあなたが望むものですが、 +
そして /
)。あなたは、おそらくBase64エンコーディングを使用してから、 +
そして /
2つの他の "許可された文字"がある場合、 -
そして _
?)。
あなたの言語で利用可能な既存のBase64エンコードとデコード機能が存在するはずです。
回答№2の場合は1
暗号化(またはこのケースではハッシュ)はバイト配列を返します。バイト値を16進文字列に変換して渡します。
private static string ByteArrayToHexString(byte[] byteArray)
{
string result = string.Empty;
foreach (byte outputByte in byteArray)
{
result += outputByte.ToString("x2");
}
return result;
}
次に、16進文字列をバイト配列に変換する
private static byte[] HexStringToByteArray(String hexString)
{
int stringLength = hexString.Length;
byte[] bytes = new byte[stringLength / 2];
for (int i = 0; i < stringLength; i += 2)
{
bytes[i / 2] = System.Convert.ToByte(hexString.Substring(i, 2), 16);
}
return bytes;
}
これらのメソッドを使用すると、渡す唯一の値は16進数(0123456789ABCDEF)になります。