データモデルをまるごと、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);
}
}