私は、各ユーザーごとにランダムなHMACキーを生成し、そのキーをデータベースに格納します。ユーザーはキーを要求する場合にのみキーを取得し、ほとんどの場合、BASE64でエンコードされた不透明キーとしてAPIトークン(SWT)を使用し、その完全性について心配する必要はありません。データベースストレージのHMAC鍵を暗号化/復号化できないのはなぜですか?
キーが侵害されないように、キーをSQL Serverデータベースに格納する前に、そのキーを暗号化します。暗号化されたキーはvarbinary(MAX)列に格納されます。すべてが暗号化なしで素晴らしい作品です。
暗号化された値の先頭にランダムに生成されたIVを使用した暗号化にAESを使用しています。
単純な文字列での私の単体テストでは、HMACキーですべてがうまくいきますが、復号化された値は元のものと決して一致しません。 HMACキーを生成し、暗号化してデータベースに格納します。私はそれを取得し、解読し、キーを使用してHMACハッシュを生成しますが、元のHMACハッシュ値と一致しません。
下記の暗号化/復号化方法を参照してください。
public static byte[] Encrypt(byte[] value)
{
using (AesCryptoServiceProvider aes = new AesCryptoServiceProvider())
{
Rfc2898DeriveBytes key = new Rfc2898DeriveBytes(_password, Encoding.ASCII.GetBytes(_salt));
aes.Key = key.GetBytes(aes.KeySize/8);
aes.GenerateIV();
aes.Padding = PaddingMode.PKCS7;
aes.Mode = CipherMode.CBC;
using (var crypt = aes.CreateEncryptor(aes.Key, aes.IV))
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, crypt, CryptoStreamMode.Write))
{
cs.Write(aes.IV, 0, aes.IV.Length);
using (BinaryWriter bw = new BinaryWriter(cs))
{
bw.Write(value);
cs.FlushFinalBlock();
}
return ms.ToArray();
}
}
}
}
public static byte[] Decrypt(byte[] value)
{
using (AesCryptoServiceProvider aes = new AesCryptoServiceProvider())
{
Rfc2898DeriveBytes key = new Rfc2898DeriveBytes(_password, Encoding.ASCII.GetBytes(_salt));
aes.Key = key.GetBytes(aes.KeySize/8);
aes.Padding = PaddingMode.PKCS7;
aes.Mode = CipherMode.CBC;
using (MemoryStream ms = new MemoryStream(value))
{
byte[] iv = new byte[aes.IV.Length];
ms.Read(iv, 0, aes.IV.Length);
aes.IV = iv;
using (var crypt = aes.CreateDecryptor(aes.Key, aes.IV))
using (CryptoStream cs = new CryptoStream(ms, crypt, CryptoStreamMode.Read))
{
using (StreamReader sr = new StreamReader(cs))
return Encoding.ASCII.GetBytes(sr.ReadToEnd());
}
}
}
}
パスワードと塩は、コードにコンパイルされたconst文字列リテラルに格納されます。私はこれが理想的ではないことを認識していますが、それは今のためのものです。
あなたはいくつかのコードを書いていますが、どのように動作しないのかはわかりません... –
HMAC鍵を生成して暗号化してデータベースに格納します。私はそれを取得し、解読し、キーを使用してHMACハッシュを生成しますが、元のHMACハッシュ値と一致しません。 –
問題を診断するために何をしましたか?すべての段階でバイトを記録しましたか? (暗号化の前、暗号化の後、データベースに保存する前、データベースから取り出した後、復号化前、復号化後...)基本的には、問題の原因となっているステージを正確に分離する必要があります。 –