Хеширование SHA1 в SQLite: как? - PullRequest
6 голосов
/ 05 июля 2010

Работа с несколькими БД параллельно и необходимо инициализировать некоторые записи хешированными паролями. В MS SQL server есть удобные функции, которые позволяют хешировать на лету:


HashBytes('SHA1', CONVERT(nvarchar(32), N'admin'))

Есть ли аналогичная функция с SQLite?

Если нет, то какой самый простой обходной путь (например, выберите из SQL server и каким-то образом вставьте его в SQLite таблицы)?

Предпочтительный алгоритм хеширования - SHA1, а пароли хранятся в столбце BLOB.

Обновление: я использую язык C # в текущем проекте.

Ответы [ 4 ]

10 голосов
/ 05 июля 2010

Нет такой функции, встроенной в SQLite3.

Но вы можете определить пользовательскую функцию, например с sqlite3_create_function, если вы используете интерфейс C, и реализуйте SHA-1 с этим. (Но если у вас есть программируемый интерфейс, возможно, вы могли бы просто SHA-1 пароль за пределами механизма SQL.)

Вы также можете попытаться найти / создать расширение и загрузить с помощью функцию load_extension , но у меня нет опыта в этом.

Edit:

4 голосов
/ 05 июля 2010

SQLite не поставляется с SHA1, но его относительно легко добавить. Вы не сказали, какой язык вы используете, но вы можете посмотреть документацию C для create_function и sqlite3_result . Вы также можете взглянуть на этот пример о том, как добавить SHA1 в SQLite с использованием Ruby.

С System.Data.SQLite они называются пользовательскими функциями. Вы можете посмотреть этот пример на главном сайте.

3 голосов
/ 23 октября 2012

Вы можете создать пользовательскую функцию для 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')
1 голос
/ 05 июля 2010

Насколько я знаю, SQLite не имеет встроенных функций хеширования.

Существует способ добавить пользовательские функции в SQLite, но, вероятно, будет проще, если вы просто вычислите хеш SHA1 в своей программе и сохраните его в SQlite.Пользовательские функции для SQLite в некоторой степени зависят от API и языка, который вы используете.У меня есть только опыт создания функций SQLite из Python.

...