сжатие хэша SHA-256

Я хочу автоматически генерировать serialVersionUID для Java (длинный или 64-битный). То, что отличает сериализуемый объект, определяется примерно 20 целыми числами, но не всегда 20 целыми числами. Я намерен преобразовать целые числа в строку чисел, разделенных запятыми, и запустить ее через хеш-функцию SHA-256.

Поскольку SHA-256 имеет длину 32 байта (256 бит), и мне нужно, чтобы он вписывался в serialVersionUID (64 бита), как я могу преобразовать его в 64-битное значение и свести к минимуму потерю характеристик хорошего хэша?


person H2ONaCl    schedule 19.10.2012    source источник
comment
Вы знаете об инструменте «serialver»? А знаете ли вы, что идентификаторы serialVersionUID не обязательно должны быть разными для каждого класса?   -  person user207421    schedule 20.10.2012
comment
Я знаю, что версии класса не должны быть разными. Мне не нужно, чтобы каждая версия класса отличалась. Я использую serialVersionUID, потому что хочу контролировать совместимость, но я также могу это автоматизировать. Таким образом, я сохраняю контроль и устраняю риск человеческой ошибки.   -  person H2ONaCl    schedule 28.10.2012


Ответы (5)


Просто обрежьте лишнее. Нет необходимости усложнять вещи. Если есть лучший метод, чем просто взять первые (или любые другие) 64 бита, то хэш в первую очередь будет сломан.

person svinja    schedule 19.10.2012

Во-первых, маловероятно, что вы сможете сжать хороший хеш в обычном смысле. Сжатие — это обратимое кодирование, уменьшающее избыточность. В хорошем хеше не должно быть избыточности, которую нужно уменьшить, и, следовательно, сжатие будет неэффективным.

Поскольку SHA-256 имеет длину 32 байта (256 бит), и мне нужно, чтобы он вписывался в serialVersionUID (64 бита), как я могу преобразовать его в 64-битное значение и свести к минимуму потерю характеристик хорошего хэша?

Так что же это за хорошие характеристики? Что ж, основная характеристика хорошего хэша заключается в том, что его нецелесообразно реверсировать; то есть нецелесообразно обрабатывать возможный ввод, который привел к хешу. И связанная с этим характеристика заключается в том, что при известном вводе, который создает данный хэш, нецелесообразно создавать другой ввод (т.е. коллизию), который дает тот же хэш.

Теперь, когда вы переходите с 256-битного хэша на 64-битный, вы намного проще переворачивать хэш или создавать коллизию для хэша... методом грубой силы. По сути, 64-битный хэш означает, что в 2^64 есть один шанс, что любой случайный ввод будет иметь заданный хэш. Эта вероятность достаточно велика, чтобы какой-нибудь «плохой парень» с достаточным количеством ядер имел достаточно хорошие шансы на успех (в разумное время), чтобы сделать грубую силу разумным вариантом.

Но действительно ли это имеет значение? Чего можно добиться, создав конфликтующую строку serialVersion? Эти строки не являются секретными и ничего определенного не говорят об API объекта...

Суть в том, что если эти сокращенные хэши используются, поскольку строки serialVersion предназначены для использования, то не будет никаких проблем (например) только с использованием первых 64 бит хэша SHA-256. Нет необходимости в XOR, контрольной сумме или каких-либо других более сложных преобразованиях.

person Stephen C    schedule 19.10.2012
comment
Здесь много хороших моментов, а также хороший момент об использовании слова compression. - person H2ONaCl; 11.12.2012

Вы можете рассчитать проверку циклическим избыточным кодом (CRC) дайджеста SHA-256.

person Community    schedule 19.10.2012

Я бы сказал, либо используйте 64-битную контрольную сумму, либо, если вы хотите придерживаться SHA, тогда используйте XOR для 64-битных фрагментов.

person Tobias Ritzau    schedule 19.10.2012

хешировать его с помощью ripemd-160.

eg,

4727c1278432c388eea822904f008468c02fd543fc347391d1f2b9918ec9b5b9

становится

069e298ee9d1b14e7774434624703c0be1a47ee1

То есть 66 символов, уменьшенных до 40.

person Sean Bradley    schedule 29.01.2019