压缩+编码+检查+数组序列化的最快组合是啥?

Posted

技术标签:

【中文标题】压缩+编码+检查+数组序列化的最快组合是啥?【英文标题】:What is the fastest combination of compression + encoding + checking + serialization of an array?压缩+编码+检查+数组序列化的最快组合是什么? 【发布时间】:2012-02-18 18:24:55 【问题描述】:

我需要一个功能组合:

数组序列化(无对象,小 - 3-7 个键值对字符串,无引用) 上面的数据有效性检查(哈希放在数组里面会更好吗?) 上面的加密(是否有任何加密方法可以验证解密信息?) 上面的压缩(我不确定成本是否值得:带宽/CPU时间)

...一个数组。

一切都应该针对速度进行优化。

为了序列化数组,我考虑使用 json_encode() 而不是 serialize(),因为它更快。见Preferred method to store php arrays (json_encode vs serialize)。

对于数据有效性检查,我正在考虑使用 sha1(),但我正在考虑使用 crc32,因为它更快,而且我不认为碰撞很接近。见Fastest hash for non-cryptographic uses?。

我做的加密:

<?php

function encode($pass, $data) 
  return mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $pass, $data, MCRYPT_MODE_ECB);


function decode($pass, $data) 
  return mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $pass, $data, MCRYPT_MODE_ECB);


$rand = str_repeat(rand(0, 1000), 5);

$start = microtime(true);
for($i = 0; $i <= 10000; $i++)
  encode('pass', $rand);


echo 'Script took ' . (microtime(true) - $start) . ' seconds for encryption<br/>';

$start = microtime(true);
for($i = 0; $i <= 10000; $i++)
  encode('pass', $rand);


echo 'Script took ' . (microtime(true) - $start) . ' seconds for decryption';

结果是:

Script took 1.8680129051208 seconds for encryption
Script took 1.8597548007965 seconds for decryption

我宁愿避免任何随机性。我知道 CBC 模式更安全,但也更慢。

对于压缩,鉴于生成的字符串是二进制且短的,我不知道用什么更好。

是否有任何压缩不需要编码以便将结果字符串设置为 cookie?我知道 sha1() 例如只返回数字和字母。

这是一个复杂的问题。因此,请随时指出任何错误或不准确的地方。 它包含许多主题,但基本上简短的问题是如何安全快速地加密/解密数组,同时拥有一个小的表示形式。

这是正确的顺序吗?

鉴于生成的JSON 的可能性很高,是否需要数据验证 如果数据被更改,将无效?

是否有一个功能已经结合了这些或其中一些功能?

【问题讨论】:

为什么不在服务器端存储会话数据并在需要时调用它?这将节省对加密 cookie 的全部需求。 我将创建另一个问题并链接。这是一个不同的话题。这个想法是避免 Memcached、NFS、会话数据库或会话服务器。 确保你只“知道”真实的事情;) @GregS 你在说什么? 【参考方案1】:

我知道CBC模式更安全,但也更慢

比欧洲央行?仅当数据超过几个块时。

如果你想要最快的加密算法,那么没有什么可以替代你自己测试的——有点奇怪的是,PHP 的 sha1() 实现比它的 md5() 快得多(我知道这些是哈希——这是为了说明性能取决于实现和算法一样多)。

你为什么要验证它?如果它是一个加密的数据报,那么内容对用户来说是不透明的 - 如果他们试图篡改它,那么它很可能无法解压缩,在不太可能的情况下它仍然解压缩然后解码将失败,但在远程情况下,这两者都不是碰巧检查其他修改应该很容易 - 即使是嵌入式 CRC32 似乎也有点过头了。

为了将结果字符串设置为 cookie

听起来您正在使用大量花哨的加密来掩盖应用程序的基本不安全性——它很可能容易受到重放攻击。而且您还需要确保您的数据适合 cookie。为什么不直接使用带有随机值发送到客户端的服务器端会话(如果你想实现一个记住我类型的函数并且仍然有一个传统的会话,你不必使用 PHP 会话处理程序)。

【讨论】:

如果数据被更改,压缩失败是对的。关于cookie认为:这不是在掩盖不安全感。基本上,cookie 本身就是会话。关键是不使用会话(和套件 Memcached/服务器会话)。这个的应用是另一个问题。当使用没有初始向量的 CBC 时,PHP 会发出一个丑陋的通知。 我认为你是对的,PHP 中的实现可能会有所不同。我要做一些研究,然后回来提供一些统计数据。【参考方案2】:

在我看来,只使用压缩就足够了。要对压缩进行逆向工程,需要很长时间。我可以推荐一个霍夫曼压缩。

【讨论】:

正向工程也需要很长时间。除非您使用现有的。但是,逆向工程不会花很长时间。 @GregS:尤其是适用于不同浏览器和 7 位字符集的版本。我在隐藏字段中使用它并下载当前的引擎状态。

以上是关于压缩+编码+检查+数组序列化的最快组合是啥?的主要内容,如果未能解决你的问题,请参考以下文章

最快的 stride-3 收集指令序列是啥?

在 Swift 中检查 2 个固定大小的数组是不是相等的最快方法是啥?

检查一个类型是不是是 blittable 的最快方法?

硬盘序列号和mac地址是一个东西吗?他们分别是啥?硬盘序列号可以该吗?

访问和更改长布尔值数组的最快实现是啥?

高效的数据压缩编码方式 Protobuf