2013-03-10 6 views
2

Tout le temps je lis sur les services Web qui défendent les données de l'utilisateur en cryptant tout. En cas de vol de la base de données, tout est en sécurité (à condition de prendre tous les éléments habituels de la cryptographie).Cryptage des données sensibles - DataMapper + Sinatra

Je suis en train de jouer avec une petite application Sinatra (pas vraiment dans le but de le lancer, c'est plus à des fins éducatives) en utilisant le DataMapper ORM sur Sqlite. J'ai implémenté l'authentification basique de l'utilisateur (hachage et salage ... bref tout le truc habituel) et j'en suis content. Le fait est que le cœur de l'application nécessite des informations personnelles sur l'utilisateur: poids et autres mesures corporelles (qui peuvent être sans aucun doute considérées comme des données personnelles et sensibles, que les gens peuvent ne pas vouloir être public). Alors je me demande comment puis-je stocker ces données en toute sécurité? Dans l'application tout est accessible seulement par l'utilisateur approprié (bien qu'étant tout à fait un débutant dans ces choses et ayant codé presque tout à la main, je suis tout à fait sûr qu'il y a beaucoup de bugs de sécurité ... mais comme je l'ai dit je ne suis pas vraiment prévu de faire quoi que ce soit avec).

J'ai pensé à le crypter en utilisant le mot de passe de l'utilisateur et en le décryptant après une authentification réussie, mais que se passe-t-il si le mot de passe est oublié? Que faire si le mot de passe est changé? J'ai lu (ici sur SO) que pour ces raisons, il est préférable de ne pas le faire de cette façon .. mais alors comment peut-il être fait?

+0

Ce n'est pas une mauvaise approche pour chiffrer l'aide du mot de passe, vous devrez mettre à jour la date chaque fois que le mot de passe change et si le mot de passe est perdu, les données le sont également. Mais alors vous devrez vous assurer que le mot de passe de l'utilisateur est crypté de manière sécurisée. Vous pouvez également utiliser une authentification basée sur un ID ouvert, par exemple leur profil Facebook. +1 bonne question – nikhil

+3

@nikhil Je ne suis pas d'accord, utiliser le mot de passe pour crypter est une mauvaise idée. L'utilisation du mot de passe pour _allow_ decryption est très bien. Helios, je vous conseille de regarder [laisser la base de données gérer cela] (http://dba.stackexchange.com/questions/3585/postgresql-row-level-encryption), ou en utilisant [rbnacl] (https: // github .com/cryptosphere/rbnacl) ou simplement l'accès au cryptage [bibliothèque standard] (http://stackoverflow.com/questions/4128939/simple-encryption-in-ruby-without-external-gems). – iain

+0

Je n'étais pas au courant de cette fonctionnalité dans postgresql. Si tel est le cas, votre approche est bien meilleure. – nikhil

Répondre

0

Vous pouvez faire un gem install attr_secure puis procédez comme suit pour les objets rubis:

Set, faisant une ENV [ « de ATTR_SECURE_SECRET »] La ATTR_SECURE_SECRET de votre environnement travaille dans l'application. En outre, définissez/modifiez les colonnes de table pour les valeurs chiffrées afin qu'elles puissent contenir les valeurs longues et cryptées.

Maintenant, vous pouvez le faire (par exemple à partir du readme attr_secure):

class Report < ActiveRecord::Base 
    attr_secure :secret_value 
end 

r = Report.new 
r.secret_value = "ThisIsATest" 
r.save 
=> #<Report id: 116, secret_value: "EKq88AMFeRLqEx5knUcoJ4LOnrv52d7hfAFgEKMoDKzqNei4m7k..."> 

r = Report.find(116) 
r.secret_value 
=> "ThisIsATest" 

Vous pouvez en savoir plus: https://github.com/neilmiddleton/attr_secure

Questions connexes