Ruby 敏感数据加密-DataMapper+;西纳特拉

Ruby 敏感数据加密-DataMapper+;西纳特拉,ruby,security,encryption,sinatra,Ruby,Security,Encryption,Sinatra,我一直在读有关通过加密所有内容来保护用户数据的web服务的文章。在数据库被盗的情况下,一切都是安全的(前提是我们假设所有通常的加密技术) 我正在使用Sqlite上的DataMapperORM玩一个小的Sinatra应用程序(实际上并不打算启动它,它更多的是为了教育目的)。我实现了基本的用户身份验证(简单地说,就是散列和盐析…所有常用的东西),我对此很满意 事实上,应用程序的核心需要用户的个人信息:体重和其他身体测量数据(毫无疑问,这些数据可以被视为个人和敏感数据,人们可能不想公开)。所以我想知道

我一直在读有关通过加密所有内容来保护用户数据的web服务的文章。在数据库被盗的情况下,一切都是安全的(前提是我们假设所有通常的加密技术)

我正在使用Sqlite上的DataMapperORM玩一个小的Sinatra应用程序(实际上并不打算启动它,它更多的是为了教育目的)。我实现了基本的用户身份验证(简单地说,就是散列和盐析…所有常用的东西),我对此很满意

事实上,应用程序的核心需要用户的个人信息:体重和其他身体测量数据(毫无疑问,这些数据可以被视为个人和敏感数据,人们可能不想公开)。所以我想知道,如何安全地存储这些数据?在应用程序中,所有内容都只能由适当的用户访问(虽然我是这方面的新手,并且几乎所有内容都是手工编写的,但我很确定存在很多安全漏洞……但正如我所说,我并不打算对它做任何事)


我曾考虑过使用用户密码对其进行加密,并在成功身份验证后对其进行解密,但如果忘记了密码怎么办?如果密码更改了怎么办?我(在这里)读到,出于这些原因,最好不要这样做。。但是怎样才能做到呢?

您可以执行
gem安装attr\u secure
,然后对ruby对象执行以下操作:

设置您的环境的ATTR\u SECRET,以便在应用程序中执行ENV[“ATTR\u SECRET”]操作。另外,为加密值设置/更改任何表列,以便它们可以保存长的加密值

现在您可以这样做了(来自attr_secure自述文件的示例):

类报告 #
r=报告。查找(116)
r、 秘密价值
=>“这是一个测试”

您可以在以下位置阅读更多内容:

使用密码加密不是一种坏方法,每当密码更改时,您都必须更新日期,如果密码丢失,数据也会丢失。但是,您需要确保用户密码是安全加密的。你也可以使用开放的基于身份的认证,比如他们的facebook个人资料+1好的question@nikhil我不同意,使用密码加密是个坏主意。使用密码允许解密是可以的。Helios,我建议查看、使用或只是加密访问。我不知道postgresql中有这个功能。如果是这样的话,那么你的方法肯定会更好。个人数据永远不会安全。除非用户对所有数据进行加密,否则你或多或少要对所有事情负责,如果你丢失了密码或密钥文件,所有东西都会丢失。你还需要小心不要公开你的en/解密密钥。您希望确保攻击者很难找到您的解密密钥。常用的策略是使用键设置环境变量,并将env set代码放入为该帐户运行但该帐户不可见的受保护帐户区域。因此,攻击者必须让你的应用程序暴露实时环境变量,才能获取你的密钥。不是唯一的方法,而是一种方法。。
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"