Хэширование 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:


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.