2011年10月22日土曜日

Silverlight4で分離ストレージへ保存

Silverlight4で分離ストレージに保存する。
データモデルをまるごと、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);
        }
    }

2011年10月13日木曜日

Dell Vostro200 にWindows2003 Server R2 セットアップ

Dell Vostro200 に Windows2003 Server R2 インストールのメモ
普通にセットアップ
ドライバーは、Dellサイトから XPのドライバーをダウンロード

  1. チップセット
  2. Intelのサウンドドライバ゛ー
  3. RealtekのAudioドライバー

以上をゴニョゴニョしてセットアップでOK