Как стать автором
Обновить

Электродневник

Время на прочтение3 мин
Количество просмотров2.2K
Года два назад сделал на Silverlight для личного пользования вэб-приложение для ведения личного дневника. Для тех кому это нужно — хочу поделиться своим решением.

На личном опыте знаю, что основная функция дневника — это быстрое добавление небольшой новой записи (перечитывание дневника случается раз в пару лет). Ну и, конечно, крайне важно обеспечить конфиденциальность.

Приложение имеет только клиентскую часть, сами данные в интернете не хранятся. По сути, приложение является специализированным редактором локальных файлов с возможностью автоматического шифрования и добавления к записям метаданных.

Попробовать в действии можно тут: www.kalantyr.ru/Diary без каких-либо регистраций.

Синхронизацию данных между компьютерами (велосипед) решил не изобретать и синхронизирую файл данных просто через DropBox. Или можно носить его с собой на флэшке — кому как удобнее.

Предваряя сомнения: возможно, кто-то скажет, что вот сейчас приложение ничего никуда не отправляет, а через пару месяцев тихо начнет… Если кому нужно — я могу выслать исходники, мне не жалко. Или просто готовый скомпилированный xap-модуль — выкладывайте на свой хостинг и пользуйтесь на здоровье.



Вот скриншоты для тех кто не хочет устанавливать 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

Одна из фич, которые для меня были важны — это теги. Причем тэг у меня — это не просто слово, а Название+Описание. Например, тэгом можно описать человека, а в Описание добавить его контактную информацию.

Время идет, технологии меняются, чтобы была возможность попроще перейти с 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;
		}


Update:
Вот скомпилированное приложение для запуска на локальном компьютере (без Интернета): dl.dropbox.com/u/5681766/Habr/Diary/Diary.zip

Update 2:
А вот исходники: dl.dropbox.com/u/5681766/Habr/Diary/Diary_SourceCode.zip
Теги:
Хабы:
Всего голосов 18: ↑12 и ↓6+6
Комментарии21

Публикации

Истории

Ближайшие события