2010-07-05 142 views
6

并行处理多个数据库并需要用散列密码初始化一些记录。在MS SQL server有方便的功能,允许散列上飞:SQLite SHA1哈希:如何?


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

是否有与SQLite类似的功能?

如果不是,这是最简单的解决方法(例如从SQL server中选择并以某种方式将其插入到SQLite表中)?

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

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

+5

SHA-1是不加密,但密码散列函数。 – Gumbo 2010-07-05 11:32:03

+2

SHA1不是散列密码的好选择,因为它是加速的方式,因此使暴力破解变得容易。看看BCrypt或PBKDF2这样的密钥派生函数,后者是用C#编译的,因为BCrypt库可用。 – martinstoeckli 2012-10-23 12:30:24

回答

10

SQLite3中没有内置这样的函数。

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

你也可以尝试找到/创建一个扩展并使用the load_extension function加载,但是我没有有这方面的经验。

编辑:

4

SQLite不附带SHA1,但它相对容易添加。您没有说出您正在使用的语言,但您可以查看create_functionsqlite3_result的C文档。您还可以看看如何使用Ruby将SHA1添加到SQLite的this example

随着System.Data.SQLite,它们被称为用户定义的函数。您可以在主网站上查看this example

+0

我在Win平台上使用C#/ .NET(问题正文已更新) – BreakPhreak 2010-07-05 11:26:27

1

据我所知,SQLite没有任何内置的散列函数。

a way向SQLite添加自定义函数,但如果您只是在程序中计算SHA1哈希并将其存储在SQlite中,则可能更容易。

为SQLite创建自定义函数取决于您所使用的API和语言。我只有使用Python创建SQLite函数的经验。

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