SQLite中的SHA1哈希:如何使用?

11

如果您需要同时使用几个数据库,并且需要使用哈希密码初始化一些记录,那么在MS SQL server中有一些方便的函数可以实现即时哈希:


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

是否有类似于SQLite的功能?

如果没有,哪种方法最容易解决问题(例如从SQL Server中选择数据并将其插入到SQLite表中)?

首选哈希算法是SHA1,密码存储在BLOB列中。

更新:我在当前项目中使用C#语言。


5
SHA-1不是加密,而是密码哈希函数。 - Gumbo
2
SHA1不是散列密码的好选择,因为它速度太快,因此容易受到暴力破解。建议查看像BCrypt或PBKDF2这样的密钥派生函数,后者已经内置于C#中,而BCrypt库也可以使用。 - martinstoeckli
6个回答

14

SQLite3没有内置这样的功能。

但是,如果您使用C接口,您可以定义一个用户函数,例如sqlite3_create_function,并使用它实现SHA-1。(但如果您有可编程接口,也许您可以在SQL引擎之外对密码进行SHA-1处理。)

您还可以尝试查找/创建扩展,并使用load_extension函数加载,但我没有相关经验。

编辑:


6

5

4
您可以像这样在C#中创建自定义的SHA1函数:

您可以在C#中编写以下代码来创建自定义的SHA1函数:

[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')

2
以下是使用动态库支持构建最新的sqlite,并编译 sha1扩展。它还假定您使用基于Debian的Linux发行版:
sudo apt build-dep sqlite3 # fetches dependencies to compile sqlite3

mkdir sqlite-compilation
cd    sqlite-compilation

wget -O sqlite.tar.gz https://www.sqlite.org/src/tarball/sqlite.tar.gz?r=release

tar xzf sqlite.tar.gz

mkdir build
cd    build
  ../sqlite/configure
  make OPTS='-DSQLITE_ENABLE_LOAD_EXTENSION'
  ./sqlite3 -cmd 'pragma compile_options;' <<< .exit
cd -

cd sqlite/ext/misc
  # https://sqlite.org/src/file?name=ext/misc/sha1.c
  sed -i 's/int sqlite3_sha_init(/int sqlite3_extension_init(/' sha1.c # this is needed to give object file custom name, for example libSqlite3Sha1.so:
  gcc -g -O2 -shared -fPIC -I ../../../build -o libSqlite3Sha1.so ./sha1.c
  cp libSqlite3Sha1.so ../../../build/
cd -

结果是:
build/sqlite3           # sqlite3 binary
build/libSqlite3Sha1.so # sha1 extension

测试:
cd build
  sqlite3 <<< '
.load ./libSqlite3Sha1
select sha1(1);
.exit
  '
  # compare output with:
  echo -n 1 | sha1sum
cd -

谢谢!运行得非常好 :) - Pa_

1
据我所知,SQLite没有内置任何哈希函数。
一种方法可以向SQLite添加自定义函数,但如果您只是在程序中计算SHA1哈希并将其存储在SQLite中,那可能会更容易些。
为SQLite创建自定义函数在某种程度上取决于您使用的API和语言。我只有使用Python创建SQLite函数的经验。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接