SQLite SHA1哈希:如何?
并行处理多个数据库并需要用散列密码初始化一些记录。在MS SQL server
有方便的功能,允许散列上飞:SQLite SHA1哈希:如何?
HashBytes('SHA1', CONVERT(nvarchar(32), N'admin'))
是否有与SQLite
类似的功能?
如果不是,这是最简单的解决方法(例如从SQL server
中选择并以某种方式将其插入到SQLite
表中)?
首选散列算法是SHA1
,密码存储在BLOB
列中。
更新:我在当前项目中使用C#语言。
SQLite3中没有内置这样的函数。
但是你可以定义一个用户函数,例如如果您使用C接口并使用该接口实现SHA-1,则使用sqlite3_create_function
。 (但是,如果你有一个可编程接口,也许你可以在SQL引擎之外使用SHA-1密码。)
你也可以尝试找到/创建一个扩展并使用the load_extension
function加载,但是我没有有这方面的经验。
编辑:
- 见this answer on SQLiteFunction Simple Not Working如何在C#与
System.Data.SQLite
定义自定义功能。 - 使用System.Security.Cryptography.SHA1来计算SHA-1散列。
SQLite不附带SHA1,但它相对容易添加。您没有说出您正在使用的语言,但您可以查看create_function和sqlite3_result的C文档。您还可以看看如何使用Ruby将SHA1添加到SQLite的this example。
随着System.Data.SQLite,它们被称为用户定义的函数。您可以在主网站上查看this example。
我在Win平台上使用C#/ .NET(问题正文已更新) – BreakPhreak 2010-07-05 11:26:27
据我所知,SQLite没有任何内置的散列函数。
有a way向SQLite添加自定义函数,但如果您只是在程序中计算SHA1哈希并将其存储在SQlite中,则可能更容易。
为SQLite创建自定义函数取决于您所使用的API和语言。我只有使用Python创建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')
SHA-1是不加密,但密码散列函数。 – Gumbo 2010-07-05 11:32:03
SHA1不是散列密码的好选择,因为它是加速的方式,因此使暴力破解变得容易。看看BCrypt或PBKDF2这样的密钥派生函数,后者是用C#编译的,因为BCrypt库可用。 – martinstoeckli 2012-10-23 12:30:24