データモデルをまるごと、AESの暗号化をして保存する
using System.Xml; using System.Xml.Serialization; using System.Security.Cryptography; using System.Text;
/// <summary> /// 保存ストレージ保存用ユーザプロファイル /// </summary> [XmlRoot("UserProfile")] public class UserProfileDataModel { /// <summary> /// ログインユーザ /// </summary> [XmlElement("LoginUserID")] public string LoginUserID { get; set; } /// <summary> /// 最終操作日時 /// </summary> [XmlElement("LastUpdateDateTime")] public DateTime LastUpdateDateTime { get; set; } /// <summary> /// 自動ログインタイムアウト /// </summary> [XmlElement("TimeoutHour")] public int TimeoutHour { get; set; } // パスワード private const string PASSWORD = "Password_Present"; // ファイル名 private const string FILENAME = "UserProfile.xml"; /// <summary> /// 分離ストレージへ保存 /// </summary> public void SaveProfile() { var isoStorage = IsolatedStorageFile.GetUserStoreForSite(); using (isoStorage) { var isoStream = new IsolatedStorageFileStream(FILENAME , FileMode.Create , FileAccess.Write , isoStorage); using (isoStream) { var serializer = new XmlSerializer(typeof(UserProfileDataModel)); XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces(); var aesManage = new AesManaged(); using (aesManage) { GenerateKeyFromPassword(PASSWORD, aesManage); CryptoStream cryStream = new CryptoStream(isoStream, aesManage.CreateEncryptor(), CryptoStreamMode.Write); using (cryStream) { namespaces.Add(string.Empty, string.Empty); serializer.Serialize(cryStream, this, namespaces); } } } } } /// <summary> /// 分離ストレージから読み込み /// </summary> /// <returns>null以外:読み込んだユーザプロファイル</returns> public static UserProfileDataModel LoadProfile() { UserProfileDataModel loadUserProfile = default(UserProfileDataModel); IsolatedStorageFile isoStorage = IsolatedStorageFile.GetUserStoreForSite(); using (isoStorage) { if (!isoStorage.FileExists(FILENAME)) { //ファイルが存在しない時 return default(UserProfileDataModel); } var isoStream = new IsolatedStorageFileStream(FILENAME , FileMode.Open , FileAccess.Read , isoStorage); using (isoStream) { // AES 作成 var aesManage = new AesManaged(); using (aesManage) { // キーとIVを設定する GenerateKeyFromPassword(PASSWORD, aesManage); CryptoStream cryStream = new CryptoStream(isoStream, aesManage.CreateDecryptor(), CryptoStreamMode.Read); using (cryStream) { try { var serializer = new XmlSerializer(typeof(UserProfileDataModel)); loadUserProfile = (UserProfileDataModel)serializer.Deserialize(cryStream); } catch (CryptographicException) { //復号化失敗 return loadUserProfile; } } } } } return loadUserProfile; } /// <summary> /// パスワードから共有キーと初期化ベクタを生成する /// </summary> /// <param name="password">基になるパスワード</param> /// <param name="aesManaged">対象のAES</param> private static void GenerateKeyFromPassword(string password, AesManaged aesManaged) { //パスワードから共有キーと初期化ベクタを作成する byte[] salt = System.Text.Encoding.UTF8.GetBytes("PasswordSalt:More_Than_8_Bytes"); var deriveBytes = new System.Security.Cryptography.Rfc2898DeriveBytes(password, salt); deriveBytes.IterationCount = 1000; //共有キーと初期化ベクタを生成する aesManaged.Key = deriveBytes.GetBytes(aesManaged.KeySize / 8); aesManaged.IV = deriveBytes.GetBytes(aesManaged.BlockSize / 8); } }
0 件のコメント:
コメントを投稿