スケジュール要素などで複数のグループを管理し、子供たちの医療情報も管理するシンプルなシステムを求めている非営利団体に無料相談を行っています。そのすべてがExcelファイルにありますが、問題は看護師にとってあまり便利ではありません。だから私はこのasp.netアプリケーションを構築していて、機密データの暗号化に関して壁にぶつかりました。私はこのウェブサイトの本と推奨事項に続いてこのc#コードを書きました。私はそれを正しくやっていますか?
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using System.Web.UI.WebControls;
public partial class SymmetricEncryptionWithPassword : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Encrypt_OnClick(object sender, EventArgs e)
{
// Initialize the algorithm from the values on the page.
SymmetricAlgorithm symmetricAlgorithm = new AesManaged();
byte[] generatedKey = null;
byte[] generatedIV = null;
TextBox salt = (TextBox)DetailsView1.FindControl("TextBox2");
TextBox ssn = (TextBox)DetailsView1.FindControl("TextBox1");
salt.Text = Convert.ToBase64String(GenerateSalt());
GetKeyAndIVFromPasswordAndSalt(this.password.Text, Convert.FromBase64String(salt.Text), symmetricAlgorithm, ref generatedKey, ref generatedIV);
symmetricAlgorithm.Key = generatedKey;
symmetricAlgorithm.IV = generatedIV;
ICryptoTransform encryptor = symmetricAlgorithm.CreateEncryptor(symmetricAlgorithm.Key, symmetricAlgorithm.IV);
// Create the streams used for encryption.
MemoryStream memoryStream = new MemoryStream();
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))
{
byte[] plainTextAsBytes = new UTF8Encoding(false).GetBytes(ssn.Text);
cryptoStream.Write(plainTextAsBytes, 0, plainTextAsBytes.Length);
}
symmetricAlgorithm.Clear();
byte[] encryptedData = memoryStream.ToArray();
ssn.Text = Convert.ToBase64String(encryptedData);
}
protected void Decrypt_OnClick(object sender, EventArgs e)
{
// Initialize the algorithm from the values on the page.
SymmetricAlgorithm symmetricAlgorithm = new AesManaged();
byte[] generatedKey = null;
byte[] generatedIV = null;
TextBox txt = (TextBox)DetailsView1.FindControl("TextBox2");
TextBox txt1 = (TextBox)DetailsView1.FindControl("TextBox1");
GetKeyAndIVFromPasswordAndSalt(this.password.Text, Convert.FromBase64String(txt.Text), symmetricAlgorithm, ref generatedKey, ref generatedIV);
symmetricAlgorithm.Key = generatedKey;
symmetricAlgorithm.IV = generatedIV;
ICryptoTransform decryptor = symmetricAlgorithm.CreateDecryptor(symmetricAlgorithm.Key, symmetricAlgorithm.IV);
// Create the streams used for encryption.
MemoryStream memoryStream = new MemoryStream();
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Write))
{
byte[] encryptedDataAsBytes = Convert.FromBase64String(txt1.Text);
cryptoStream.Write(encryptedDataAsBytes, 0, encryptedDataAsBytes.Length);
}
symmetricAlgorithm.Clear();
byte[] decryptedData = memoryStream.ToArray();
txt1.Text = Encoding.UTF8.GetString(decryptedData);
}
private static byte[] GenerateSalt()
{
const int MinSaltSize = 8;
const int MaxSaltSize = 16;
// Generate a random number to determine the salt size.
Random random = new Random();
int saltSize = random.Next(MinSaltSize, MaxSaltSize);
// Allocate a byte array, to hold the salt.
byte[] saltBytes = new byte[saltSize];
// Initialize the cryptographically secure random number generator.
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
// Fill the salt with cryptographically strong byte values.
rng.GetNonZeroBytes(saltBytes);
return saltBytes;
}
private static void GetKeyAndIVFromPasswordAndSalt(string password, byte[] salt, SymmetricAlgorithm symmetricAlgorithm, ref byte[] key, ref byte[] iv)
{
Rfc2898DeriveBytes rfc2898DeriveBytes = new Rfc2898DeriveBytes(password, salt);
key = rfc2898DeriveBytes.GetBytes(symmetricAlgorithm.KeySize / 8);
iv = rfc2898DeriveBytes.GetBytes(symmetricAlgorithm.BlockSize / 8);
}
}
}
コードは機能します。データを入力すると、データベースに暗号化され、適切なSaltが値とともに保存されます。たとえば、テキストボックスで復号化する場合は、正しく機能します。
私の考えは次のとおりです。看護師はフォームにデータを入力し、パスワードで暗号化します。暗号化されたMediCare番号とソルト値がサーバーによって生成され、SQLサーバーに送信されます。MediCareは次のようなテーブルで暗号化されます。 。
Medicare_ID-int(主キー)
Medicar_Number-(varchar(MAX))
Medicare_SALT-(varchar(MAX))
復号化パスワードはデータベースに保存されていません。私はこれを目的で行いました。
ここでのベストプラクティスに従っているかどうかはわかりませんが、物理サーバーが盗まれた場合に情報を簡単に復号化できますか?彼らはまだデータを復号化するためのパスワードの権利を必要としていますか?緊急時に復号化する必要がある場合があります。私の復号化方法は安全ですか?もう1つの懸念は、1and1共有ウェブホスティングを使用していることです。
情報が暗号化されて目が落ちるのを防ぐために、SSLがWebサイトでアクティブ化されるなど、さらにいくつかのセキュリティ対策を設定しました。
万が一に備えて、接続文字列と入力がサニタイズされるようにしますが、理論的には、1〜2人のマネージャーまたは看護師だけがデータを操作します。
Webサイトへのアクセスは、VisualStudio2010から借用したログインコントロールを使用したユーザー名パスワードで保護されています。
これを読んでくれてありがとう