2010-07-05 52 views
6

Làm việc với một số DB song song và cần khởi tạo một số bản ghi có mật khẩu băm. Trong MS SQL server có chức năng tiện dụng cho phép để băm một cách nhanh chóng:Hàm băm SHA1 trong SQLite: làm thế nào?


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

Có là một chức năng tương tự với SQLite?

Nếu không, cách giải quyết dễ nhất (chẳng hạn như chọn từ SQL server và bằng cách nào đó chèn nó vào SQLite bảng)?

Thuật toán băm ưa thích là SHA1 và mật khẩu được lưu trữ trong cột BLOB.

Cập nhật: Tôi sử dụng ngôn ngữ C# trong dự án hiện tại.

+5

SHA-1 không phải là một mã hóa nhưng một hàm băm mật mã. – Gumbo

+2

SHA1 không phải là một lựa chọn tốt để băm mật khẩu, bởi vì nó là cách để nhanh chóng, và do đó làm cho brute-buộc dễ dàng. Có một cái nhìn tại các chức năng dẫn xuất quan trọng như BCrypt hoặc PBKDF2, sau này được xây dựng trong C#, cho các thư viện BCrypt có sẵn. – martinstoeckli

Trả lời

10

Không có chức năng nào được tích hợp trong SQLite3.

Nhưng bạn có thể xác định hàm người dùng, ví dụ: với sqlite3_create_function nếu bạn đang sử dụng giao diện C và triển khai SHA-1 với giao diện đó. (Nhưng nếu bạn đang có một giao diện lập trình có lẽ bạn chỉ có thể SHA-1 mật khẩu bên ngoài của công cụ SQL.)

Bạn cũng có thể thử tìm/tạo tiện ích mở rộng và tải với the load_extension function, nhưng tôi không có kinh nghiệm về điều đó.

Edit:

4

SQLite không đi kèm với SHA1, nhưng tương đối dễ dàng để thêm. Bạn không nói ngôn ngữ nào, bạn đang sử dụng, nhưng bạn có thể xem tài liệu C cho create_functionsqlite3_result. Bạn cũng có thể xem this example về cách thêm SHA1 vào SQLite bằng Ruby.

Với System.Data.SQLite, chúng được gọi là hàm do người dùng xác định. Bạn có thể xem this example trên trang web chính.

+0

Tôi sử dụng C# /. NET trên nền tảng Win (phần thân câu hỏi được cập nhật) – BreakPhreak

1

Theo như tôi biết, SQLite không có bất kỳ hàm băm nào được tích hợp sẵn.

a way để thêm các hàm tùy chỉnh vào SQLite, nhưng có lẽ dễ dàng hơn nếu bạn chỉ tính hàm băm SHA1 trong chương trình của bạn và lưu nó trong SQlite.

Tạo chức năng tùy chỉnh cho SQLite phụ thuộc phần nào vào API và ngôn ngữ bạn đang sử dụng. Tôi chỉ có kinh nghiệm với việc tạo ra các hàm SQLite từ Python.

3

Bạn có thể tạo một hàm tùy chỉnh cho SHA1 trong C# như thế này:

[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); 
     } 
    } 
} 

Chức năng này có thể được gọi là dữ liệu nhị phân hoặc chuỗi. Các chuỗi được băm trong biểu diễn Unicode của chúng. Điều này phải khớp với SQL Server.

Chức năng có thể được gọi như thế này:

select sha1('abc') 
select sha1(x'010203') 
Các vấn đề liên quan