服务器端与客户端文件散列


Server-side vs client-side file hashing

我将要编写一个需要在服务器上存储一些文件的小webapp/工具/小部件。为了避免服务器端不必要的负载,我想在客户端创建文件哈希(使用SHA, MD5或其他…)。使用HTML5 FileAPI是可以管理的,但是Opera和IE9的用户会被解雇。为了保持应用程序的跨浏览器兼容性,可以使用JAVA或Flash小程序代替HTML5方法。但是因为我不熟悉JAVA/Flash(我只会在生死关头使用它们),如果可能的话,我想坚持使用JS。但是我们欢迎所有客户端的建议……JS, JAVA, Flash,等等

传统的POST方法(使用PHP)无论用户代理是什么都可以做到。而且我敢说这样更安全。

长话短说,我的问题是:为什么我应该更喜欢客户端而不是服务器端哈希?

你能提供这两种方法的优缺点吗?

服务器端更多的负荷,但不是那么多。编写代码,计时,测量内存使用等等。我怀疑这将是一个大问题,特别是如果你可以用一个cron作业来分散负载,如果它是巨大的。

客户端

您不能信任这些散列,要验证它们需要您在服务器上重新计算它们。更少的服务器负载,但如果需要一段时间来散列一个大文件,这对用户来说会很烦人。

我会在服务器端做,除非你每分钟有数千个大文件!

我试着写一些关于在客户端这样做的优点,但在我看来,你只会让自己变得困难。您将如何确保提交的哈希是由您生成的?任何人都可以很容易地使用像Firebug这样的工具来改变正在运行的代码(如果我错了,请纠正我,我从来没有真正使用过它:D)。此外,他们可以创建/伪造自己的请求并将其发布到您的PHP文件中,因此您将失去很多控制。

那么如何检查数据呢?生成另一个哈希并相互检查?但是你已经在服务器端做了!

因此,应该考虑将哈希操作保持在服务器端,在那里您可以控制环境。哈希算法已经存在很多年了,所以我相信他们已经优化了很多。你将确保你的客户端更兼容。

如果你有足够的流量,哈希是一个主要的性能打击,那么可能是时候升级到更大的…

但是不要误解我的意思,这是非常可能的,而且是有意义的- http://www.movable-type.co.uk/scripts/sha1.html -但我就是不能让自己相信这个解决方案。

如果JavaScript被关闭怎么办?如果您在服务器端进行工作,则不必依赖JavaScript来完成工作。宁愿使用额外的服务器资源100%保证它会工作!