Криптографические хэши позволяют отождествить большой набор данных с компактной последовательностью бит фиксированной длины, что значительно упрощает проверку неизменности исходной информации. Недостатком является то, что хаотичная последовательность из нескольких десятков цифр трудно воспринимается человеком, невозможно на глаз сразу определить - изменился ли хэш. Проект Vash, первый релиз которого вышел несколько дней назад, призван устранить данный недостаток, представляя хэши в виде картинок. Код Vash написан на языке Java и распространяется под лицензией AGPLv3.
В отличие он ранее предпринимаемых попыток графического представления хэшей, таких как Identicon, визуальное оформление хэшей в Vash значительно более наглядно, лучше воспринимается и запоминается. Если в Identicon изображение формируется из геометрических фигур, то в Vash генерируются более реалистичные изображения. Каждое из изображений обладает своим характером, который сразу бросается в глаза и западает в память.
Vash поддерживает генерацию изображений для любых порций данных, от нескольких слов и base64-последовательностей, до криптографических ключей и больших файлов. В качестве начальных данных для формирования изображения берется результат выполнения хэш-функции SHA-512, т.е. с криптографической точки зрения Vash-изображения уникальны на уровне хэша SHA-512.
Из дополнительных применений называется верификация ввода номеров кредитных карт. Например, вместо практикуемого отображения части номера кредитной карты (**************1234) гораздо нагляднее вывести хорошо запоминающуюся картинку, которую пользователь сможет мгновенно сверить с полученным аналогичным образом изображением, напечатанным на карте. Еще одной областью использования Vash может стать подтверждение корректности ввода закрытых данных, например, вывод изображения позволит пользователю сразу оценить корректно введен пароль или нет.
К сожалению формирование подобных изображений достаточно ресурсоёмкая задача, требующая больших вычислений. Выход виделся в реализации алгоритма генерации изображений с использованием OpenCL, расширений для параллельного программирования с возможностью задействования GPU видеокарт. Вынос вычислительной логики на плечи GPU позволил на несколько порядков ускорить генерацию изображений. По оценке разработчиков работающий на стороне GPU прототип Vash должен работать в 100-500 раз быстрее реализации на языке Си, выполняемой на CPU. Вариант с OpenCL был опробован в реализации на языке Python с использованием библиотеки PyOpenCL.
К сожалению, реализовать идею полного привлечения GPU для вычислений в конечном итоге не удалось и разработчики пока ограничились использованием только CPU. Первая проблема всплыла из-за необходимости организации обхода дерева в процессе генерации изображения - необходимый уровень вложенности удалось реализовать только на CPU. Вторая проблема оказалась более серьезной - так как до получения хэша неизвестно какие вычисления потребуются, невозможность предкомпилировать код для GPU и его приходится формировать в процессе создания изображения. Компиляторы OpenCL от компания AMD и Nvidia генерируют очень быстрый и прекрасно оптимизированный код, но сам процесс компиляции занимает слишком много времени. В итоге, генерация изображения на стороне GPU занимает всего 50-100 нс, но на сопутствующие операции тратится около 20-60 секунд времени CPU, что неприемлемо.