并行处理多个DB,需要使用散列密码初始化一些记录。在MS SQL server
中,有一些方便的函数允许动态散列:
HashBytes('SHA1', CONVERT(nvarchar(32), N'admin'))
SQLite
是否有类似的功能?
如果没有,这是最简单的解决方法(例如从SQL server
中选择并以某种方式将其插入SQLite
表)?
首选哈希算法为SHA1
,密码存储在BLOB
列中。
更新:我在当前项目中使用C#语言。
答案 0 :(得分:10)
SQLite3中没有内置这样的功能。
但你可以定义一个用户功能,例如如果您正在使用C接口,则使用sqlite3_create_function
,并使用它实现SHA-1。 (但是如果你有一个可编程接口,也许你可以在SQL引擎之外使用SHA-1密码。)
您还可以尝试查找/创建扩展程序并使用the load_extension
function加载,但我没有相关经验。
编辑:
System.Data.SQLite
定义自定义函数,请参阅this answer on SQLiteFunction Simple Not Working。答案 1 :(得分:4)
SQLite不附带SHA1,但添加相对容易。您没有说出您正在使用的语言,但您可以查看create_function和sqlite3_result的C文档。您还可以查看this example如何使用Ruby将SHA1添加到SQLite。
使用System.Data.SQLite,它们被称为用户定义的函数。您可以在主站点上查看this example。
答案 2 :(得分:3)
您可以在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')
答案 3 :(得分:2)
答案 4 :(得分:1)
据我所知,SQLite没有内置任何散列函数。
有a way向SQLite添加自定义函数,但如果只计算程序中的SHA1哈希并将其存储在SQlite中,则可能更容易。
为SQLite创建自定义函数在某种程度上取决于API和您正在使用的语言。我只有从Python创建SQLite函数的经验。
答案 5 :(得分:0)
以下内容构建了具有动态库支持的最新sqlite,并编译了sha1 extension。它还假定基于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 -