- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在 LAMP 堆栈之上设计一个存储云软件。
文件可以有一个内部 ID,但是在服务器文件系统中不使用递增的 id 作为文件名,而是使用哈希作为文件名来存储它们会有很多好处。
如果当前的集中式数据库应该被分片或分散,或者应该设置某种主-主高可用性环境,那么哈希作为数据库中的标识符也会有很多优势。但我还不确定。
客户端可以在任何字符串(通常是某种路径和文件名)下存储文件。
这个字符串保证是唯一的,因为在第一层是类似于用户在 Amazon S3 和 Google 存储中注册的“存储桶”。
我的计划是将文件存储为客户端定义路径的哈希值。
通过这种方式,存储服务器可以直接为文件提供服务,而无需数据库询问它是哪个 ID,因为它可以即时计算哈希值,从而计算文件名。
但我害怕碰撞。我目前正在考虑使用 SHA1 哈希。
我听说 GIT 也使用散列和修订标识符。
我知道碰撞的机会真的很低,但有可能。
我只是无法判断这一点。为此,您会还是不会依赖哈希?
我还可以对路径编码进行一些规范化。也许 base64 作为文件名,但我真的不想要它,因为它可能会变得困惑,路径可能会变得太长,并且可能会出现其他并发症。
最佳答案
假设您有一个具有“完美”属性的散列函数,并假设加密散列函数方法适用的理论与适用于 birthday attacks 的理论相同。 .这就是说,给定最大数量的文件,您可以通过使用更大的哈希摘要大小来使碰撞概率尽可能小。 SHA 有 160 位,因此对于任何实际数量的文件,冲突的概率几乎为零。如果您查看链接中的表格,您会看到具有 10^10 个文件的 128 位哈希的冲突概率为 10^-18 。
只要概率足够低,我认为解决方案是好的。与行星被小行星撞击的概率、磁盘驱动器中无法检测到的错误、内存中的位翻转等相比——只要这些概率足够低,我们就不必担心它们,因为它们“永远不会”发生。只需留出足够的余量并确保这不是最薄弱的环节。
需要关注的一件事是散列函数的选择及其可能的漏洞。是否有任何其他身份验证或用户只是提供路径并检索文件?
如果您考虑攻击者试图对上述场景进行暴力破解,他们将需要请求 2^18 个文件,然后才能获取系统中存储的其他一些随机文件(再次假设 128 位哈希和 10^10 个文件,您将有更少的文件和更长的哈希)。 2^18 是一个相当大的数字,您可以暴力破解的速度受网络和服务器的限制。一个简单的在 x 次尝试后将用户锁定的策略可以完全关闭这个漏洞(这就是许多系统实现这种策略的原因)。构建一个安全的系统很复杂,需要考虑的点很多,但这种方案可以是完全安全的。
希望这是有用的...
编辑:另一种思考方式是,实际上每个加密或身份验证系统都依赖于某些安全概率非常低的事件。例如我可以很幸运地猜到 512 位 RSA key 的主要因素,但不太可能认为系统非常安全。
关于hash - 依靠哈希进行文件识别有多安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5525215/
可以创建许多内存密集型对象,然后放弃对它们的引用。例如,我可能想从数据库中下载某些数据并对其进行操作,我将进行100次单独的下载和处理迭代。我可以一次声明一个DataTable变量,然后对于每个查询,
当我运行这个查询时,我该怎么做才能做到这一点。 SELECT distinct cus_areacode AS "Area Code", cus_code AS "Number" FROM CUSTO
假设我有一个随机的 zend_db_select 对象。 我如何对该对象进行计数,以便知道满足查询的项目数量。 我尝试了以下方法: $data->TotalRecords = $select->col
我有几个流依赖于在一个流中生成然后传递给另一个流的 session 变量。依赖两个异步流使用的 session 变量是否安全?我想我没有完全理解 mule 应用程序或给定 mule 消息中“sessi
我有一个代表两个用户之间交易的模型,如下所示: class Transaction(models.Model): buyer = models.ForeignKey( Pers
我一直在浏览DeHL repository on GoogleCode ,对我来说看起来真的很好。 许多有趣的功能使基本的编程任务变得更加容易; DotNet FCL 中存在但 Delphi RTL
我正在构建一个包含产品的网站,每个产品都属于一个或多个类别,这些类别可以嵌套在父类别中。我想要 SEO 友好的 URL,如下所示: mysite.com/category/ mysite.com/ca
我有一个超过 7500 万行的 RDD,当我对其调用 count 函数时,我每次都会得到不同的数字。我的理解是 count 应该给出确切的数字。 编辑 只是为了给出数据的概念,结构是这样的 Useri
我想使用以下两个(简化的)表格来计算每个用户访问我的网站的唯一天数: Table: Users +--------------+------------------+ | Field |
我有三个表: users 只有两列:id: INT, name: TEXT houses 三列:id: INT, user_id: INT, sold_at: DATE users_with_hous
我的应用程序偶尔会遇到死锁,因为两个事务需要更新相同的行但顺序不同(例如,事务 A 更新行 X 然后 Y,而事务 B 更新行 Y 然后 X)。 由于各种原因,解决避免此类死锁的传统方法(锁定或以一致的
在这个示例程序中,我使用 strtok_r 将一个字符串拆分为两个标记。 #include #include int main(void) { char buf[] = "Hello Wo
Windows 句柄有时很烦人,要记得在之后进行清理(使用创建的笔和画笔进行 GDI 就是一个很好的例子)。 RAII 解决方案很棒,但是为每种不同类型的 handle 制作一个完整的(五法则)RAI
我了解到 NSUbiquitousKeyValueStore 始终可用,在 no iCloud account 时也是如此已成立。这让我相信我可以安全地将基本数据存储在其中,而无需在 NSUserDe
我正在创建一个新的 DataFrame,其中包含来自 Join 的少量记录。 val joined_df = first_df.join(second_df, first_df.col("key")
我一直在疯狂地创建单元测试,并发现我经常不得不在一个测试中设置一些我刚刚在之前的测试中删除的东西。在一次测试(例如插入测试)中创建某些内容(例如数据库记录)然后将其用于以后的测试(例如删除测试)是否合
我有一个 user_entry 表,其中包含一个date 字段。数据类型是日期时间。数据库是mysql。我想要当前日期和当前月份以及当前日期的所有数据的计数。 我怎样才能得到这个? 我尝试了以下查询,
我正在使用 Rob Conery 的 Massive ORM。 有没有一种优雅的方法来计算返回的记录集? dynamic viewModelExpando = result.ViewData.Mode
在 spark Dataframe 上获得计数的最佳方法是什么? 1) 我试过 count 会添加一个 Action 。但我不想添加额外的操作。 2) 我在 RDD 上使用了累加器,为此数据帧需要转换
我有两个类 Quiz{ String name static hasMany[tags:Tag] } Tag{ String tag } 如何使用标准构建器在 grails 中编写以下
我是一名优秀的程序员,十分优秀!