ฉันสร้างบริการ crypto โดยใช้ AES-GCM เพื่อเข้ารหัสข้อมูลที่ละเอียดอ่อนในฐานข้อมูล ประการแรก ฉันกำลังสร้างคีย์เข้ารหัสจากรหัสผ่าน (อาจจะเก็บไว้ใน Kubernetes Secrets) โดยใช้ Rfc2898DeriveBytes จากนั้นส่งคีย์นี้ไปยังอินสแตนซ์ AesGcmคุณสามารถค้นหาการใช้งานด้านล่าง
CryptoService ระดับสาธารณะ: ICryptoService, IDisposable
{
ส่วนตัวอ่านอย่างเดียว AesGcm _aesGcm;
CryptoService สาธารณะ (รหัสผ่านสตริง, เกลือสตริง)
{
คีย์ไบต์ [] = ใหม่ Rfc2898DeriveBytes (รหัสผ่าน, Encoding.UTF8.GetBytes (เกลือ), 200000, HashAlgorithmName.SHA512).GetBytes (32);
// รับคีย์การเข้ารหัสข้อมูลที่เข้ารหัสแบบสุ่มที่สร้างขึ้นอย่างปลอดภัยจาก Azure Vault
สตริงเข้ารหัสEncryptionKey = AzureVault.GetDataEncryptionKey();
ไบต์ [] encryptionKey = AzureVault.Decrypt (เข้ารหัส EncryptionKey, คีย์);
_aesGcm = ใหม่ AesGcm (เข้ารหัสคีย์);
}
การเข้ารหัสสตริงสาธารณะ (สตริงข้อความธรรมดา)
{
ไบต์ [] plainBytes = Encoding.UTF8.GetBytes (ข้อความธรรมดา);
int nonceSize = AesGcm.NonceByteSizes.MaxSize;
int tagSize = AesGcm.TagByteSizes.MaxSize;
int cipherSize = plainBytes.Length;
// รวมเพื่อการเข้ารหัสที่ง่ายขึ้น
int encryptedDataLength = 4 + nonceSize + 4 + tagSize + cipherSize;
ช่วง <ไบต์> encryptedData = encryptedDataLength < 1024 ? ไบต์ stackalloc [encryptedDataLength] : ไบต์ใหม่ [encryptedDataLength].AsSpan ();
BinaryPrimitives.WriteInt32LittleEndian (เข้ารหัส Data.Slice (0, 4), nonceSize);
BinaryPrimitives.WriteInt32LittleEndian(encryptedData.Slice(4 + nonceSize, 4), tagSize);
var nonce = encryptedData.Slice (4, nonceSize);
แท็ก var = encryptedData.Slice (4 + nonceSize + 4, tagSize);
var cipherBytes = encryptedData.Slice (4 + nonceSize + 4 + tagSize, cipherSize);
RandomNumberGenerator.Fill(ไม่มี);
_aesGcm.Encrypt(ไม่มี, plainBytes.AsSpan(), cipherBytes, แท็ก);
กลับ Convert.ToBase64String (encryptedData);
}
ถอดรหัสสตริงสาธารณะ (string cipherText)
{
Span<byte> encryptedData = Convert.FromBase64String(cipherText).Aspan();
int nonceSize = BinaryPrimitives.ReadInt32LittleEndian (encryptedData.Slice(0, 4));
int tagSize = BinaryPrimitives.ReadInt32LittleEndian (encryptedData.Slice (4 + nonceSize, 4));
int cipherSize = encryptedData.Length - 4 - nonceSize - 4 - tagSize;
var nonce = encryptedData.Slice (4, nonceSize);
แท็ก var = encryptedData.Slice (4 + nonceSize + 4, tagSize);
var cipherBytes = encryptedData.Slice (4 + nonceSize + 4 + tagSize, cipherSize);
ช่วง<byte> plainBytes = cipherSize < 1024 ? ไบต์ stackalloc [cipherSize] : ไบต์ใหม่ [cipherSize];
_aesGcm.Decrypt (ไม่มี, cipherBytes, แท็ก, ไบต์ธรรมดา);
กลับ Encoding.UTF8.GetString(ธรรมดาไบต์);
}
}
นี่คือคำถามของฉัน ฉันสงสัยว่าการใช้งานนี้มีความปลอดภัยเพียงพอหรือไม่ เนื่องจากฉันไม่ใช่ผู้เชี่ยวชาญด้านความปลอดภัย ฉันพลาดจุดหรือช่องโหว่ด้านความปลอดภัยยกเว้นการรักษาความปลอดภัยด้วยรหัสผ่านหรือไม่ คำแนะนำและข้อเสนอแนะใด ๆ ที่จะได้รับการชื่นชมอย่างมาก
ขอบคุณ.