如果您需要同时使用几个数据库,并且需要使用哈希密码初始化一些记录,那么在MS SQL server
中有一些方便的函数可以实现即时哈希:
HashBytes('SHA1', CONVERT(nvarchar(32), N'admin'))
是否有类似于SQLite
的功能?
如果没有,哪种方法最容易解决问题(例如从SQL Server
中选择数据并将其插入到SQLite
表中)?
首选哈希算法是SHA1
,密码存储在BLOB
列中。
更新:我在当前项目中使用C#语言。
如果您需要同时使用几个数据库,并且需要使用哈希密码初始化一些记录,那么在MS SQL server
中有一些方便的函数可以实现即时哈希:
HashBytes('SHA1', CONVERT(nvarchar(32), N'admin'))
是否有类似于SQLite
的功能?
如果没有,哪种方法最容易解决问题(例如从SQL Server
中选择数据并将其插入到SQLite
表中)?
首选哈希算法是SHA1
,密码存储在BLOB
列中。
更新:我在当前项目中使用C#语言。
SQLite3没有内置这样的功能。
但是,如果您使用C接口,您可以定义一个用户函数,例如sqlite3_create_function
,并使用它实现SHA-1。(但如果您有可编程接口,也许您可以在SQL引擎之外对密码进行SHA-1处理。)
您还可以尝试查找/创建扩展,并使用load_extension
函数加载,但我没有相关经验。
编辑:
System.Data.SQLite
定义自定义函数。您可以在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')
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 -