Хэширование SHA1 в SQLite: как?
работа с несколькими DBs параллельно и необходимо инициализировать некоторые записи с хэшированными паролями. В MS SQL server
есть удобные функции, которые позволяют окрошка на лету:
HashBytes('SHA1', CONVERT(nvarchar(32), N'admin'))
есть ли аналогичная функция с SQLite
?
если нет, что является самым простым обходным путем (например, выберите из SQL server
и как-то вставить в SQLite
таблицы)?
предпочтительным алгоритмом хэширования является SHA1
и пароли хранятся в BLOB
колонна.
Update: я использую язык C# в текущем проекте.
4 ответов
нет такой функции, встроенной в SQLite3.
но вы можете определить пользовательскую функцию, например, с sqlite3_create_function
если вы используете интерфейс C и реализуете SHA-1 с этим. (Но если у вас есть программируемый интерфейс, возможно, вы могли бы просто SHA-1 пароль вне SQL engine.)
вы также можете попытаться найти / создать расширение и загрузить с на load_extension
функции, но у меня нет опыта на что.
Edit:
- посмотреть это ответ на SQLiteFunction Просто Не Работает для того, чтобы определить пользовательскую функцию с
System.Data.SQLite
в C#. - использовать
SQLite не поставляется с SHA1, но его относительно легко добавить. Вы не сказать, какой язык вы используете, но вы можете посмотреть документацию для create_function и sqlite3_result. Вы также можете взглянуть на о том, как добавить SHA1 в SQLite с помощью Ruby.
с на главной сайта.
вы можете создать пользовательскую функцию для SHA1 в C# следующим образом:
[SQLiteFunction(Name = "Sha1", Arguments = 1, FuncType = FunctionType.Scalar)]
public class Sha1 : SQLiteFunction
{
public override object Invoke(object[] args)
{
var buffer = args[0] as byte[];
if ( buffer == null )
{
var s = args[0] as string;
if ( s != null )
buffer = Encoding.Unicode.GetBytes(s);
}
if ( buffer == null )
return null;
using ( var sha1 = SHA1.Create() )
{
return sha1.ComputeHash(buffer);
}
}
}
эта функция может быть вызвана для двоичных данных или строк. Строки хэшируются в их представлении Unicode. Это должно соответствовать SQL Server.
функция может быть вызвана следующим образом:
select sha1('abc')
select sha1(x'010203')
насколько я знаю, SQLite не имеет встроенных функций хэширования.
здесь путь чтобы добавить пользовательские функции в SQLite, но, вероятно, проще, если вы просто вычислите хэш SHA1 в своей программе и сохраните его в SQlite.
создание пользовательских функций для SQLite несколько зависит от API и языка, который вы используете. У меня есть только опыт создания функций SQLite из Python.