SQL Server Compact на Windows Phone поддерживает шифрование файла базы данных. При указании пароля в ConnectionString во время шифрования и последующих открытий содержимое файла базы данных будет зашифровано.
Помните, что шифрование ухудшит производительность базы данных из-за дополнительной обработки, необходимой для расшифровки и шифрования данных.
При использовании шифрования также следует помнить, что если вы не защитите строку подключения (пароль), любой, кто ее знает, сможет открыть файл базы данных.
Некоторые разработчики телефонов (см. Этот пост на форуме, например) столкнулись с проблемами при перемещении баз данных с устройства на настольный компьютер и наоборот, когда используется шифрование. В этом посте я попытаюсь понять, что можно и что нельзя делать в этом отношении.
В корневом контекстном меню панели инструментов SQL Server Compact выберите «Добавить соединение 3.5» и выберите «Создать»:
Укажите пароль «zyx» и нажмите «ОК». Теперь у нас есть соединение с зашифрованным файлом базы данных на рабочем столе.
Откройте редактор SQL и создайте базовую таблицу:
CREATE Table Test ( Id int PRIMARY KEY, Data nvarchar(10) );
Теперь создайте приложение для Windows Phone 7.1 и добавьте файл базы данных сверху как Content:
Щелкните правой кнопкой мыши соединение с базой данных на панели инструментов SQL Server Compact, выберите «Добавить Windows Phone DataContext…» и нажмите кнопку «ОК». Файл WP7EncryptContext.cs теперь добавлен в проект.
Добавьте ссылку на System.Data.Linq и скомпилируйте проект.
Добавьте кнопку с именем «Connect» и добавьте обработчик события щелчка со следующим кодом:
using (WP7EncryptContext db = new WP7EncryptContext(WP7EncryptContext.ConnectionStringReadOnly + ";Password=zyx")) { var list = db.Test.ToList(); }
Теперь запустите приложение в эмуляторе, нажав F5 (отладка):
Очевидно, что шифрование рабочего стола несовместимо с ядром базы данных устройства!
Теперь удалите файл базы данных из проекта и создайте файл базы данных в изолированном хранилище — измените код обработчика события click:
using (WP7EncryptContext db = new WP7EncryptContext(WP7EncryptContext.ConnectionString + ";Password=zyx")) { db.CreateIfNotExists(); var list = db.Test.ToList(); var test = new Test(); test.Id = 2; test.Data = "ErikEJ"; db.Test.InsertOnSubmit(test); db.SubmitChanges(); }
Теперь база данных будет создана в изолированном хранилище на устройстве. Запустите снова с F5, и никаких ошибок не возникнет. И мы «предварительно заполнили» базу данных одной строкой. Давайте попробуем переместить этот файл базы данных на рабочий стол, для этого я использую
Windows Phone Power Tools из CodePlex:
Когда вы добавляете соединение в файл с устройства и нажимаете «Проверить соединение», вы получите следующее сообщение об ошибке:
Мы уже знаем, что некоторые функции версии 4.0 были доступны в ядре базы данных Windows Phone 3.5, например, поддержка OFFSET / FETCH для обеспечения возможности подкачки. Было ли перенесено на устройство расширенное шифрование версии 4.0?
На панели инструментов выберите «Добавить 4.0 соединение» и попробуйте подключиться к базе данных с устройства:
(Не забудьте указать пароль!)
Ответить Да! И теперь мы можем просматривать и проверять как схему, так и данные в файле — имейте в виду, что этот файл нельзя перенести обратно на устройство.
Теперь снова получите файл с устройства с помощью Power Tools и снова добавьте новую копию в проект, также как Content (как указано выше, но файл базы данных «предварительно заполнен» с устройства.)
Опять измените обработчик события нажатия кнопки следующим образом:
using (WP7EncryptContext db = new WP7EncryptContext(WP7EncryptContext.ConnectionStringReadOnly + ";Password=zyx")) { var list = db.Test.ToList(); if (list.Count > 0) MessageBox.Show("It works " + list[0].Data); }
Выводы:
Ты не можешь:
— Используйте зашифрованную базу данных на устройстве
— Откройте зашифрованную базу данных на рабочем столе
Ты сможешь:
— Заполните зашифрованную базу данных (но только на устройстве)
— Преобразуйте зашифрованную базу данных устройства в формат 4.0 на рабочем столе и просмотрите ее.
Благодарности: Спасибо Marc-Anthon Flohr за приглашение написать этот пост в блоге. Его обзор хорош, хотя его выводы немного отличаются.