2010-07-05 39 views
6

Trabajando con varios DB en paralelo y necesita inicializar algunos registros con contraseñas hash. En MS SQL server existen funciones útiles que permiten a un hash sobre la marcha:hash SHA1 en SQLite: ¿cómo?


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

es que hay una función similar con SQLite?

Si no es así, que es la solución más sencilla (por ejemplo, seleccione una de SQL server y de alguna manera insertarlo en SQLite tablas)?

El algoritmo hash preferido es SHA1 y las contraseñas se almacenan en una columna BLOB.

Actualización: uso el lenguaje C# en el proyecto actual.

+5

SHA-1 no es un cifrado sino una función hash criptográfica. – Gumbo

+2

SHA1 no es una buena opción para contraseñas hash, ya que se trata de formas de rápido, y por lo tanto hace fácil la fuerza bruta. Eche un vistazo a las funciones de derivación de claves, como BCrypt o PBKDF2; esta última está integrada en C#, ya que las bibliotecas de BCrypt están disponibles. – martinstoeckli

Respuesta

10

No existe tal función incorporada en SQLite3.

Pero podría definir una función de usuario, p. con sqlite3_create_function si está utilizando la interfaz C, e implemente SHA-1 con eso. (Pero si tiene una interfaz programable, tal vez podría simplemente SHA-1 la contraseña fuera del motor SQL.)

También podría tratar de encontrar/crear una extensión y cargar con the load_extension function, pero yo no tener experiencia en eso.

Editar:

4

SQLite no viene con SHA1, pero es relativamente fácil de agregar. Usted no dijo qué idioma está usando, pero puede consultar la documentación de C para create_function y sqlite3_result. También puede consultar this example para saber cómo agregar SHA1 a SQLite usando Ruby.

Con System.Data.SQLite, se denominan funciones definidas por el usuario. Puede mirar this example en el sitio principal.

+0

Utilizo C# /. NET en la plataforma Win (se actualiza el cuerpo de la pregunta) – BreakPhreak

1

Por lo que sé, SQLite no tiene ninguna función hash incorporada.

Hay a way para agregar funciones personalizadas a SQLite, pero probablemente sea más fácil si solo calcula el hash SHA1 en su programa y lo almacena en SQlite.

La creación de funciones personalizadas para SQLite depende en cierta medida de la API y el idioma que está utilizando. Solo tengo experiencia en la creación de funciones SQLite de Python.

3

Se puede crear una función personalizada para SHA1 en C# como esto:

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

Esta función puede ser llamada de datos o cadenas binarias. Las cadenas son hash en su representación Unicode. Esto debería coincidir con SQL Server.

La función se puede llamar así:

select sha1('abc') 
select sha1(x'010203') 
Cuestiones relacionadas