SHA1 en SQLite: comment?

Travailler avec plusieurs bases de données en parallèle et avoir besoin d’initialiser certains enregistrements avec des mots de passe hachés. Dans MS SQL server il existe des fonctions pratiques permettant de hacher à la volée:

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

Existe-t-il une fonction similaire avec SQLite ?

Si ce n’est pas le cas, quelle est la solution de contournement la plus simple (telle que sélectionner un SQL server et l’insérer d’une manière ou d’une autre dans les tables SQLite )?

L’algorithme de hachage préféré est SHA1 et les mots de passe sont stockés dans une colonne BLOB .

Mise à jour: J’utilise le langage C # dans le projet actuel.

Une telle fonction n’est pas intégrée à SQLite3.

Mais vous pouvez définir une fonction utilisateur, par exemple avec sqlite3_create_function si vous utilisez l’interface C, et implémenter SHA-1 avec cela. (Mais si vous avez une interface programmable, vous pourriez peut-être simplement SHA-1 le mot de passe en dehors du moteur SQL.)

Vous pouvez également essayer de trouver / créer une extension et charger avec la fonction load_extension , mais je n’ai aucune expérience dans ce domaine.

Modifier:

  • Voir cette réponse sur SQLiteFunction Simple Not Working pour savoir comment définir une fonction personnalisée avec System.Data.SQLite en C #.
  • Utilisez System.Security.Cryptography.SHA1 pour calculer le hachage SHA-1.

SQLite ne vient pas avec SHA1, mais il est relativement facile de l’append. Vous n’utilisez pas la langue que vous utilisez, mais vous pouvez consulter la documentation C pour create_function et sqlite3_result . Vous pouvez également consulter cet exemple montrant comment append SHA1 à SQLite à l’aide de Ruby.

Avec System.Data.SQLite , elles sont appelées fonctions définies par l’utilisateur. Vous pouvez regarder cet exemple sur le site principal.

Vous pouvez créer une fonction personnalisée pour SHA1 en C # comme ceci:

 [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 ssortingng; if ( s != null ) buffer = Encoding.Unicode.GetBytes(s); } if ( buffer == null ) return null; using ( var sha1 = SHA1.Create() ) { return sha1.ComputeHash(buffer); } } } 

Cette fonction peut être appelée pour des données binarys ou des chaînes. Les chaînes sont hachées dans leur représentation Unicode. Cela devrait correspondre à SQL Server.

La fonction peut s’appeler comme ceci:

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

Autant que je sache, SQLite ne possède aucune fonction de hachage intégrée.

Il existe un moyen d’append des fonctions personnalisées à SQLite, mais c’est probablement plus facile si vous calculez simplement le hachage SHA1 dans votre programme et le stockez dans SQlite.

La création de fonctions personnalisées pour SQLite dépend un peu de l’API et du langage que vous utilisez. Je n’ai que de l’expérience dans la création de fonctions SQLite à partir de Python.