关闭。这个问题是off-topic .它目前不接受答案。
想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。
8年前关闭。
Improve this question
介绍
我目前正在从事一个项目,该项目涉及每天从 VisualFox Pro 数据库中提取数据(药房记录),并将其中的一部分上传到 WordPress 网站,药房的客户可以安全地查看它。我想就我的软件的一般方法提供一些建议 - 我能够对其进行编码,但需要知道我是否采用了正确的方法。我正在编写 PC 软件(在 C#/.NET 4.5 中)和 PHP WordPress 插件。
问题 1:加密
目前我打算使用的服务器端数据加密流程基于this article .总而言之,它提倡使用存储在服务器上的自己的公钥对每个单独用户的数据进行非对称加密。然后使用用户密码对用于解密该数据的私钥本身进行对称加密并存储。这样,即使数据库被盗,用户的密码哈希也需要被破解,即使这样,也需要对每个用户的数据重复这个过程。
作者本人指出的唯一弱点,也是我问题的要点,是当用户登录时,解密的 key 存储在 session 存储中。文章建议的处理方式是限制用户登录的时间。我认为更好的解决方案是将该 key 存储在短期安全 cookie 中(当然整个过程是通过 HTTPS 进行的) .这样,如果攻击者控制了用户的计算机并且可以读取他们的cookies,他们可能只需keylog他们的密码并登录,不需要窃取数据库,而即使攻击者获得了对服务器的访问权限,他们也无法解密HTTPS 流量(或者可以吗?我不确定。)
我应该使用安全 cookie 还是 session 存储来临时存储解密的 key ?
问题 2:存储
我还想解决的第二件事是如何存储数据——这更多是一个效率问题。由于每个用户都有自己的加密 key ,因此每个用户的记录必须单独存储。我不知道是否应该为每个用户存储一个“块”数据,其中包含带有表示记录的对象数组的加密 JSON,或者是否应该将记录存储在具有实际数据结构的表中,并加密每个数据字段分别用 key 。
我倾向于将数据存储为一个块 - 在我看来,一次解密一大块数据比可能比数千个单独的字段更有效。此外,即使我以正确的结构存储数据,我仍然无法使用 MySQL 的 WHERE、ORDERBY 等,因为数据都是 BLOB。
我应该将数据存储为每个用户的一个大块,还是分成不同的字段?
问题 3:转移
我从 DBF 文件中提取数据,本质上做了一个“差异”,我将当前提取的数据与最后一天的数据进行比较,并且只上传发生变化的用户块(我不能只上传记录,因为我可能最终会将用户的数据存储在块中)。我还包括已删除用户的“删除”说明。这是因为数据库中有数十万条记录,总计超过 200 mb,并且大小每天都在增加。
我目前的计划是将所有这些数据写入一个 JSON 文件,对其进行 gzip 并上传到服务器。我的问题是,如何在确保数据安全的同时做到这一点?自然,上传将通过 HTTPS 进行,并且我有一个 API 密码来只允许授权上传,但我主要关心的是如果服务器受到威胁,如何保护数据。我不希望攻击者在处理 JSON 文件时只是从服务器获取它。我的一个想法是让服务器向我发送用户的公钥列表,并在上传之前在我的软件中执行加密。在我看来,这是保护数据的唯一方法。我可以加密整个 JSON 文件,也许使用 API key 或特殊密码,但如果攻击者可以在服务器上处理解密的文件时访问它,那就没有实际意义了。这是一个很好的解决方案吗?
我应该在客户端单独加密数据,还是有办法将它安全地传输到服务器并在那里加密?
预先感谢您提供任何答案,我很想听听以前处理过此类问题的人的意见。
注:cross-posted to Programmers , 看评论。
最佳答案
问题 1
加密
碰巧的是,我正在开发一个类似的系统来加密 Wordpress 评论中的个人详细信息(电子邮件、IP),这样如果服务器受到威胁,数据库中的敏感数据仍然会被加密。在 session 中存储非对称解密 key 对我来说是不合适的,因为这可能会将 key 留在服务器上,让攻击者在破坏它的同时获取。
因此,基于 SSL 证书的 cookie 是一种更好的方法——至少攻击者必须等待用户登录才能窃取他们的 key 。与此同时,某种绊线系统将是一个好主意,这样一旦系统受到威胁,用户就无法登录系统(从而将他们的 key 提供给等待的攻击者)。
正如您所说,加密记录(根据我的设计使用一个 key ,或根据您的设计使用多个 key )意味着搜索记录成为您必须远离数据库服务器的过程,这反过来意味着它将显着慢点。
您可以通过在速度和安全性之间进行权衡来缓解这种情况:某些字段可以被模糊化,然后以未加密的方式存储。例如,如果您想搜索患者所在的位置,从他们的地址获取他们的(纬度,经度),对其应用随机偏移(比如在两个轴上的任一方向最多 3 英里),然后存储结果坐标在纯文本中。然后可以在不解密的情况下完成与位置相关的近似计数查询。
减轻对客户端计算机的攻击
上面介绍了如何减轻对服务器的攻击,这是您最大的风险,因为您将所有记录都存储在那里。不过,正如您正确指出的那样,对客户端计算机的攻击也是一个问题,如果他们是公众成员,则可以假设他们的安全流程不存在。
在此基础上,您可以使用密码短语来加强单个密码(完整给出),客户需要从中选择三个随机字母(即它没有特别给出完整)。这以两种方式优雅地防御键盘记录器:首先使用下拉菜单,更难窃听,即使用户使用键盘快捷键,他们也没有提供完整的短语。在每次成功登录时,随机字母(例如 1、4 和 5)的索引都会被记录下来,并且在很长一段时间内不会再次询问。显然,太多的错误答案会导致帐户被锁定并需要通过电话或蜗牛邮件重置代码重新授权。
您可以使用的其他身份验证方法:每次用户输入正确密码时向用户发送额外的密码,或者(可能非常昂贵)使用在线银行中的身份验证设备。
存储很少/没有识别信息
另一个安全提示是尽可能少地存储个人信息。如果您无法通过电子邮件立即重置密码,那么姓名、地址、电话号码和电子邮件(所有个人识别数据)可能就没有必要了。该个人信息可以单独存储在另一台服务器上断开连接的数据库中,使用公共(public)主键将它们链接在一起。 (事实上,如果用户希望重置他们的密码,您可以简单地针对他们的匿名用户记录存储一个标志,药剂师可以在他们下次访问管理面板时在他们的防火墙机器上手动运行重置过程)。
问题2
您应该在一个 blob 中加密表格数据还是将其保留在每一列中?我在我的申请中也看过这个。对我来说,我将它存储在一个 blob 中,因为我的用例是搜索密集型的,并且每行有 N 次解密而不是一次使决定变得容易。也就是说,您可能更喜欢单独加密列的整洁性,并且有人可能会争辩说,如果腐败蔓延,将它们分开会给您更好的机会使某些行幸存下来。
如果您决定存储在单个 blob 中,我将使用与此类似的格式(在不对称加密之前用换行符分隔行):
1.2 <-- version of this format, so I can add things in the future
key1=value1
key2=value2
...
关于c# - 我需要开发敏感数据传输/存储/加密系统的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15011814/
当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我注意到像bundler这样的项目在每个specfile中执行requirespec_helper我还注意到rspec使用选项--require,它允许您在引导rspec时要求一个文件。您还可以将其添加到.rspec文件中,因此只要您运行不带参数的rspec就会添加它。使用上述方法有什么缺点可以解释为什么像bundler这样的项目选择在每个规范文件中都需要spec_helper吗? 最佳答案 我不在Bundler上工作,所以我不能直接谈论他们的做法。并非所有项目都checkin.rspec文件。原因是这个文件,通常按照当前的惯例,只
我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub
我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain