電気日記

約2年前、私は、Silverlightに個人用の日記を保存するWebアプリケーションを作成しました。 それが必要な人のために-私は私の決定を共有したいと思います。



個人的な経験から、日記の主な機能は小さな新しいレコードをすばやく追加することであることがわかっています(日記の再読み込みは2年に1回行われます)。 そしてもちろん、プライバシーを確​​保することは非常に重要です。



アプリケーションにはクライアント部分のみがあり、データ自体はインターネットに保存されません。 実際、このアプリケーションは、メタデータを自動的に暗号化してレコードに追加する機能を備えた専用のローカルファイルエディターです。



こちらで実際に試してみることができます: www.kalantyr.ru/Diary



コンピューター間のデータ同期(自転車)を発明しないことにし、単にDropBoxを介してデータファイルを同期しました。 または、フラッシュドライブに入れて持ち運ぶこともできます。



疑いを予測する:おそらく誰かが、アプリケーションはどこにも何も送信しないと言うでしょう。そして、数か月後に静かに開始します...誰かがそれを必要とするなら、私はソースを送信できます、私は気にしません。 または、既製のコンパイル済みxap-module-ホスティングに置いて、健康のために使用します。







以下は、Silverlightをインストールしたくない人向けのスクリーンショットです。

dl.dropbox.com/u/5681766/Habr/Diary/01.PNG

dl.dropbox.com/u/5681766/Habr/Diary/02.PNG

dl.dropbox.com/u/5681766/Habr/Diary/03.PNG

dl.dropbox.com/u/5681766/Habr/Diary/04.PNG

dl.dropbox.com/u/5681766/Habr/Diary/05.PNG

dl.dropbox.com/u/5681766/Habr/Diary/06.PNG



私にとって重要な機能の1つはタグでした。 さらに、私と一緒のタグは単なる単語ではなく、タイトルと説明です。 たとえば、タグは人を説明し、説明に彼の連絡先情報を追加できます。



時間が経つにつれて、テクノロジは変化しているため、Silverlightからより関連性の高いものに簡単に切り替えることができます。通常のxmlファイルを使用してデータをエクスポート/インポートする機能が実装されています。



何千ものレコードで何かを見つける必要がある場合、タグ/サブストリング/日付によるレコードのフィルタリングがあります。



別の明らかな機能があります-誰かが後ろに立っている場合、テンキーのプラスまたはマイナスボタンを押すと、テキストのコントラストを変更して、肩越しに判読できなくなります:)



プライバシーについて:ブラウザーからのデータはどこにも転送されません。ファイルに保存すると、データはAESによって暗号化されます。



private static byte[] Encrypt(IList<byte> key, byte[] data) { using (var encryptor = new AesManaged()) { encryptor.GenerateIV(); encryptor.IV = GetKey(key, encryptor.IV.Length); encryptor.GenerateKey(); encryptor.Key = GetKey(key, encryptor.Key.Length); using (var encryptionStream = new MemoryStream()) using (var encrypt = new CryptoStream(encryptionStream, encryptor.CreateEncryptor(), CryptoStreamMode.Write)) { encrypt.Write(data, 0, data.Length); encrypt.FlushFinalBlock(); encrypt.Close(); return encryptionStream.ToArray(); } } } private static byte[] Decrypt(IList<byte> key, byte[] data) { try { using (var decryptor = new AesManaged()) { decryptor.GenerateIV(); decryptor.IV = GetKey(key, decryptor.IV.Length); decryptor.GenerateKey(); decryptor.Key = GetKey(key, decryptor.Key.Length); using (var decryptionStream = new MemoryStream()) using (var decrypt = new CryptoStream(decryptionStream, decryptor.CreateDecryptor(), CryptoStreamMode.Write)) { decrypt.Write(data, 0, data.Length); decrypt.Flush(); decrypt.Close(); return decryptionStream.ToArray(); } } } catch (CryptographicException) { throw new InvalidOperationException(" ."); } } private static byte[] GetKey(IList<byte> value, int keyLength) { var data = new byte[value.Count * keyLength]; for (var i = 0; i < data.Length; i++) data[i] = value[i % value.Count]; var key = new byte[keyLength]; for (var i = 0; i < key.Length; i++) key[i] = data[i]; return key; }
      
      







更新:

これは、ローカルコンピューター(インターネットなし)で実行するコンパイル済みアプリケーションです。dl.dropbox.com / u / 5681766 / Habr / Diary / Diary.zip



アップデート2:

ソースは次のとおりです。dl.dropbox.com / u / 5681766 / Habr / Diary / Diary_SourceCode.zip



All Articles