Ответ 1
Почему он не использует более современную версию SHA?
Декабрь 2017: будет. И Git 2.16 (Q1 2018) - первый выпуск, иллюстрирующий и реализующий это намерение.
Примечание: см. Git 2.19 ниже: это будет SHA-256.
Git 2.16 предложит инфраструктуру для определения того, какая хеш-функция используется в Git, и начнет работу по ее внедрению в различные пути кода.
Смотрите коммит c250e02 (28 ноября 2017 г.) от Рамси Джонс ('').
Смотрите коммит eb0ccfd, коммит 78a6766, коммит f50e766, коммит abade65 (12 ноября 2017 г.) от brian m. Карлсон (bk2204
).
(Merged by Junio C Hamano -- [TG41] -- in commit 721cc43, 13 Dec 2017)
Добавить структуру, представляющую алгоритм хеширования
Поскольку в будущем мы хотим поддерживать дополнительный алгоритм хеширования, добавьте структуру, которая представляет алгоритм хеширования, и все данные, которые должны сопровождать его,.
Добавьте константу , чтобы упростить перечисление алгоритмов хеширования.
Реализуйте функциюtypedefs
, чтобы создать абстрактный API, который может использоваться любым алгоритмом хеширования, и оболочки для существующих функций SHA1, которые соответствуют этому API.Укажите значение для шестнадцатеричного размера, а также для двоичного размера.
Хотя одно всегда будет вдвое больше другого, оба значения используются чрезвычайно обычно в кодовой базе, и предоставление того и другого приводит к улучшению читабельности.Не включайте запись в структуру алгоритма хеширования для нулевого идентификатора объекта.
Поскольку это значение - все нули, можно использовать любой подходящий по размеру идентификатор объекта со всеми нулями, и нет необходимости хранить данный идентификатор отдельно для каждого хэша.Текущий план перехода хеш-функции предусматривает время, когда мы примем ввод от пользователя, который может быть в формате SHA-1 или в формате NewHash.
Поскольку мы не можем знать, что предоставил пользователь, добавьте константу , представляющую неизвестный алгоритм, чтобы мы могли указать, что мы должны искать правильное значение.
Интегрируйте поддержку алгоритма хеширования с настройкой репо
В будущих версиях Git мы планируем поддерживать дополнительный хеш Алгоритм.
Интегрируйте перечисление алгоритмов хеширования с настройкой хранилища и сохраните указатель на перечисленные данные в хранилище структуры.
Конечно, в настоящее время мы поддерживаем только SHA-1, поэтому жестко запрограммируйте это значение вread_repository_format
.
В будущем мы перечислим это значение из конфигурации.Добавьте константу
the_hash_algo
, которая указывает на указатель структурыhash_algo
в глобальном хранилище.
Обратите внимание, что это хеш, который используется для сериализации данных на диск, а не хеш, который используется для отображения элементов пользователю.
План перехода предполагает, что они могут отличаться.
Мы можем добавить дополнительный элемент в будущем (скажем,ui_hash_algo
), чтобы обеспечить это дело.
Обновление августа 2018 года для Git 2.19 (3-й квартал 2018 года). Git, похоже, выбирает SHA-256 как NewHash.
См. коммит 0ed8d8d (04 августа 2018 г.) Джонатаном Нидером (artagnon
).
Смотрите коммит 13f5e09 (25 июля 2018 года) Æвар Арнфьорд Бьярмасон (avar
).
(Merged by Junio C Hamano -- [TG49] -- in commit 34f2297, 20 Aug 2018)
doc
hash-function-transition
: выберите SHA-256 как NewHashС точки зрения безопасности, кажется, что SHA-256, BLAKE2, SHA3-256, K12 и т.д., Как полагают, имеют схожие свойства безопасности.
Все это хорошие варианты с точки зрения безопасности.SHA-256 имеет ряд преимуществ:
Он существует уже некоторое время, широко используется и поддерживается практически каждой криптографической библиотекой (OpenSSL, mbedTLS, CryptoNG, SecureTransport и т.д.).
При сравнении с SHA1DC большинство векторизованных реализаций SHA-256 действительно быстрее, даже без ускорения.
Если мы делаем подписи с OpenPGP (или даже, я полагаю, CMS), мы будем использовать SHA-2, поэтому не имеет смысла, чтобы наша безопасность зависела от двух отдельных алгоритмов, когда один из них один может сломать безопасность, когда мы можем просто зависеть от одного.
Так что SHA-256 это.
Обновите документ конструктора hash-function-transition, чтобы так сказать.После этого патча нет оставшихся экземпляров строки "
NewHash
", за исключением несвязанного с 2008 года использования в качестве имени переменной вt/t9700/test.pl
.
Вы можете увидеть этот переход к SHA 256 в процессе выполнения с Git 2.20 (Q4 2018):
См. commit 0d7c419, commit dda6346, commit eccb5a5, commit 93eb00f, commit d8a3a69, commit fbd0e37, коммит f690b6b, коммит 49d1660, коммит 268babd, коммит fa13080, коммит 7b5e614, зафиксировать 58ce21b, зафиксировать 2f0c9e9, зафиксировать 825544a (15 октября 2018 г.) от Брайан М. Карлсон (bk2204
).
Смотрите коммит 6afedba (15 октября 2018 года) СЗЕДЕР ГАБОР (szeder
).
(Merged by Junio C Hamano -- [TG415] -- in commit d829d49, 30 Oct 2018)
заменить жестко закодированные константы
Замените несколько основанных на 40 констант ссылками на
GIT_MAX_HEXSZ
илиthe_hash_algo
, в зависимости от ситуации.
Преобразуйте все использованияGIT_SHA1_HEXSZ
в использованиеthe_hash_algo
, чтобы они подходят для любой длины хэша.
Вместо использования жестко запрограммированной константы для размера шестнадцатеричного идентификатора объекта, переключиться на использование вычисленного указателя изparse_oid_hex
, который указывает после идентификатор проанализированного объекта.
GIT_SHA1_HEXSZ
дополнительно удален/заменен на Git 2.22 (Q2 2019) и commit d4e568b.
Этот переход продолжается с Git 2.21 (Q1 2019), который добавляет хэш sha-256 и подключает его через код, чтобы позволить сборку Git с помощью "NewHash".
Смотрите commit 4b4e291, commit 27dc04c, commit 13eeedb, commit c166599, commit 37649b7, commit a2ce0a7, зафиксировать 50c817e, зафиксировать 9a3a0ff, зафиксировать 0dab712, зафиксировать 47edb64 (14 ноября 2018 г.) и зафиксировать 2f90b9d, зафиксировать 1ccf07c (22 октября 2018 г.) brian m. Карлсон (bk2204
).
(Merged by Junio C Hamano -- [TG423] -- in commit 33e4ae9, 29 Jan 2019)
Добавить базовую реализацию поддержки SHA-256 (февраль 2019 г.)
SHA-1 слаб, и нам нужно перейти к новой хеш-функции.
Некоторое время мы называли эту новую функциюNewHash
.
Недавно мы решили выбрать SHA-256 какNewHash
.
Причины выбора SHA-256 изложены в этой теме и в истории фиксации для документа перехода хэш-функции.Добавьте базовую реализацию SHA-256 на основе
libtomcrypt
, которая находится в общественное достояние.
Оптимизируйте его и реструктурируйте в соответствии с нашими стандартами кодирования.
Извлеките функции update и final из реализации блока SHA-1, поскольку мы знаем, что они правильно работают со всеми компиляторами. Эта реализация медленнее, чем SHA-1, но в будущих коммитах будут представлены более производительные реализации.Подключите SHA-256 в список алгоритмов хэширования и добавьте тест, который Алгоритм работает правильно.
Обратите внимание, что в этом патче все еще невозможно переключиться на использование SHA-256 в Git.
Дополнительные исправления необходимы для подготовки кода для обработки более крупного алгоритма хеширования, и необходимы дальнейшие исправления теста.
hash
: добавить реализацию SHA-256 с использованием OpenSSLУ нас уже есть подпрограммы OpenSSL для SHA-1, поэтому добавьте подпрограммы и для SHA-256.
На Core i7-6600U эта реализация SHA-256 выгодно отличается от реализация SHA1DC SHA-1:
SHA-1: 157 MiB/s (64 byte chunks); 337 MiB/s (16 KiB chunks) SHA-256: 165 MiB/s (64 byte chunks); 408 MiB/s (16 KiB chunks)
sha256
: добавить реализацию SHA-256 с помощьюlibgcrypt
Как правило, производительность криптографических процедур, написанных на ассемблере, выше, чем у C, и это также верно для SHA-256.
Кроме того, большинство дистрибутивов Linux не могут распространять Git, связанный с OpenSSL по причинам лицензирования.Большинство систем с GnuPG также будут иметь
libgcrypt
, поскольку это зависимость от GnuPG.libgcrypt
также быстрее, чем реализация SHA1DC для сообщений размером в несколько КиБ и более.Для сравнения, на Core i7-6600U эта реализация обрабатывает 16 КиБ. куски со скоростью 355 МБ/с, в то время как SHA1DC обрабатывает эквивалентные куски со скоростью 337 MiB/s.
Кроме того, libgcrypt распространяется по лицензии LGPL 2.1, которая является совместим с GPL. Добавьте реализацию SHA-256, которая использует libgcrypt.
Обновление продолжается с Git 2.24 (Q4 2019)
Смотрите коммит aaa95df, коммит be8e172, коммит 3f34d70, коммит fc06be3, коммит 69fa337, коммит 3a4d7aa, commit e0cb7cd, commit 8d4d86b, commit f6ca67d, commit dd336a5, commit 894c0f6, коммит 4439c7a, коммит 95518fa, коммит e84f357, коммит fe9fec4, коммит 976ff7e, коммит 703d2d4, зафиксировать 9d958cc, зафиксировать 7962e04, зафиксировать комиссию 4930 (18 августа 2019 г.) от Брайана М. Карлсон (bk2204
).
(Merged by Junio C Hamano -- [TG434] -- in commit 676278f, 11 Oct 2019)
Вместо использования
GIT_SHA1_HEXSZ
и жестко закодированных констант, переключитесь на используяthe_hash_algo
.