Первые 32 бита 160-разрядного SHA1, хешируют приемлемую замену для хеша CRC32?

Я использовал приведенный ниже код в моей пользовательской библиотеке.
. Вызов с моего контроллера, как показано ниже:

function __construct() {<br />
   &nbsp;&nbsp;&nbsp; parent::__construct();<br />
   &nbsp;&nbsp;&nbsp;   $this->load->library('CommonMethods');<br />
}<br />

$config = array();<br />
$config['upload_path'] = 'assets/upload/images/';<br />
$config['allowed_types'] = 'gif|jpg|png|jpeg';<br />
$config['max_width'] = 150;<br />
$config['max_height'] = 150;<br />
$config['encrypt_name'] = TRUE;<br />
$config['overwrite'] = FALSE;<br />

// upload multiplefiles<br />
$fileUploadResponse = $this->commonmethods->do_upload_multiple_files('profile_picture', $config);

/**
 * do_upload_multiple_files - Multiple Methods
 * @param type $fieldName
 * @param type $options
 * @return type
 */
public function do_upload_multiple_files($fieldName, $options) {

    $response = array();
    $files = 

Я использовал приведенный ниже код в моей пользовательской библиотеке.
. Вызов с моего контроллера, как показано ниже:

[110]
[111]FILES; $cpt = count(

Я использовал приведенный ниже код в моей пользовательской библиотеке.
. Вызов с моего контроллера, как показано ниже:

[110]
[111]FILES[$fieldName]['name']); for($i=0; $i<$cpt; $i++) {

Я использовал приведенный ниже код в моей пользовательской библиотеке.
. Вызов с моего контроллера, как показано ниже:

[110]
[111]FILES[$fieldName]['name']= $files[$fieldName]['name'][$i];

Я использовал приведенный ниже код в моей пользовательской библиотеке.
. Вызов с моего контроллера, как показано ниже:

[110]
[111]FILES[$fieldName]['type']= $files[$fieldName]['type'][$i];

Я использовал приведенный ниже код в моей пользовательской библиотеке.
. Вызов с моего контроллера, как показано ниже:

[110]
[111]FILES[$fieldName]['tmp_name']= $files[$fieldName]['tmp_name'][$i];

Я использовал приведенный ниже код в моей пользовательской библиотеке.
. Вызов с моего контроллера, как показано ниже:

[110]
[111]FILES[$fieldName]['error']= $files[$fieldName]['error'][$i];

Я использовал приведенный ниже код в моей пользовательской библиотеке.
. Вызов с моего контроллера, как показано ниже:

[110]
[111]FILES[$fieldName]['size']= $files[$fieldName]['size'][$i]; $this->CI->load->library('upload'); $this->CI->upload->initialize($options); //upload the image if (!$this->CI->upload->do_upload($fieldName)) { $response['erros'][] = $this->CI->upload->display_errors(); } else { $response['result'][] = $this->CI->upload->data(); } } return $response; }
5
задан raven 27 May 2009 в 13:47
поделиться

5 ответов

Если вам не нужны дополнительные функции CRC32 (являющиеся линейным кодом), у вас должно быть все в порядке с сокращением вывода до 32 бит.

Вредит ли сокращение вывода некоторых криптографических хеш-функций их безопасности в отношении устойчивости к коллизиям, является открытой проблемой исследования (существуют "неестественные" построенные примеры, если я правильно помню) . Но NIST (вероятно, с одобрения NSA) все равно использовал технику вырезания, чтобы получить SHA-224 из SHA-256 (см. статью о SHA в википедии ).

EDIT: CRC32 позволяет обнаруживать (и, возможно, исправлять) однобитовые ошибки, тогда как криптографическая хеш-функция должна иметь свойство, заключающееся в том, что вы не можете найти два входа с одинаковым хеш-значением.

Известно ли вам о «парадоксе дня рождения» (см. снова википедию) )? С 32-битной контрольной суммой вы ожидаете столкновения (т. Е. два входа с одинаковым значением хэш-функции), когда у вас есть около 2 ^ 16 входов, и вы хотите хешировать гораздо больше входов. (Если вы перечитаете ваш комментарий, это не будет проблемой для вас.)

8
ответ дан 13 December 2019 в 19:34
поделиться

Как писали другие, вам нужно будет опросить INSERTED и DELETED. Однако использование «родной» 32-битной хеш-функции, вероятно, будет лучшим выбором. Может быть, кто-то, кто разбирается в этом вопросе, может дать нам лучшую причину, чем просто мое чутье :)

2
ответ дан 13 December 2019 в 19:34
поделиться

Если вы не собираетесь использовать 32-битные биты для криптографических целей, тогда все будет в порядке. В противном случае я бы не стал полагаться на то, что первые 32 бита будут иметь такое же распределение, как и весь хэш.

Почему вы не можете просто использовать более широкий доступный хеш?

0
ответ дан 13 December 2019 в 19:34
поделиться

CRC32, вероятно, подходит для ваших нужд. Это обсуждалось в , этот вопрос .

С точки зрения усечения примитива хеширования, единственным широко используемым приложением этого является псевдослучайная функция (PRF) SSL / TLS , которая используется для генерации ключей. Он использует HMAC, начальные числа и метки для генерации столько байтов, сколько вам нужно, путем многократного хеширования с последующим усечением до необходимого количества байтов.

Что касается вашего конкретного вопроса, вы можете прочитать вывод хеша в Int32, а затем xor их вместе, если вы параноик:

static void Main()
{
    int xorCrc = GetHashedCrc(new SHA1Cng(), new byte[] {0xDE, 0xAD, 0xBE, 0xEF});
}

private static int GetHashedCrc(HashAlgorithm algorithm, byte[] bytesToHash)
{
    byte[] hash = algorithm.ComputeHash(bytesToHash);
    int totalInt32s = hash.Length/sizeof(int);
    int result = 0;
    for(int i = 0; i < totalInt32s; i++)
    {
        int currentInt = BitConverter.ToInt32(hash, sizeof(int)*i);
        result = result ^ currentInt;
    }

    return result;
}
0
ответ дан 13 December 2019 в 19:34
поделиться

Почему бы вам просто не использовать string.GetHashCode (). Он предназначен для вычисления 32-битного хеш-значения и создания нескольких коллизий с учетом реальных данных. Конечно, это небезопасно, но ваш вопрос не включает это как требование.

1
ответ дан 13 December 2019 в 19:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: