Андрей Смирнов
Время чтения: ~18 мин.
Просмотров: 1

Что такое расширение файла hash?

Вычисление индекса в HashMap

Хэш код ключа может быть достаточно большим для создания массива. Сгенерированный хэш код может быть в диапазоне целочисленного типа и если мы создадим массив такого размера, то легко получим исключение outOfMemoryException. Потому мы генерируем индекс для минимизации размера массива. По сути для вычисления индекса выполняется следующая операция:

где n равна числу bucket или значению длины массива. В нашем примере я рассматриваю n, как значение по умолчанию равное 16.

HashMap:

Шаги:

  1. Вычислить значение ключа {«vishal»}. Оно будет сгенерированно, как 118.

  2. Вычислить индекс с помощью метода , который будет равен 6.

  3. Создать объект node.

  4. Поместить объект в позицию с индексом 6, если место свободно.

Теперь HashMap выглядит примерно так:

Шаги:

  1. Вычислить значение ключа {«sachin»}. Оно будет сгенерированно, как 115.

  2. Вычислить индекс с помощью метода , который будет равен 3.

  3. Создать объект node.

  4. Поместить объект в позицию с индексом 3, если место свободно.

Теперь HashMap выглядит примерно так:

Шаги:

  1. Вычислить значение ключа {«vaibhav»}. Оно будет сгенерированно, как 118.

  2. Вычислить индекс с помощью метода , который будет равен 6.

  3. Создать объект node.

  4. Поместить объект в позицию с индексом 6, если место свободно.

  5. В данном случае в позиции с индексом 6 уже существует другой объект, этот случай называется коллизией.

  6. В таком случае проверям с помощью методов hashCode() и equals(), что оба ключа одинаковы.

  7. Если ключи одинаковы, заменить текущее значение новым.

  8. Иначе связать новый и старый объекты с помощью структуры данных «связанный список», указав ссылку на следующий объект в текущем и сохранить оба под индексом 6.

Теперь HashMap выглядит примерно так:

Изображение взято из оригинальной статьи и изначально содержит ошибку. Ссылка на следующий объект в объекте vishal с индексом 6 не равна null, в ней содержится указатель на объект vaibhav.

Шаги:

  1. Вычислить хэш код объекта {“sachin”}. Он был сгенерирован, как 115.

  2. Вычислить индекс с помощью метода , который будет равен 3.

  3. Перейти по индексу 3 и сравнить ключ первого элемента с имеющемся значением. Если они равны -вернуть значение, иначе выполнить проверку для следующего элемента, если он существует.

  4. В нашем случае элемент найден и возвращаемое значение равно 30.

Шаги:

  1. Вычислить хэш код объекта {«vaibhav»}. Он был сгенерирован, как 118.

  2. Вычислить индекс с помощью метода , который будет равен 6.

  3. Перейти по индексу 6 и сравнить ключ первого элемента с имеющемся значением. Если они равны -вернуть значение, иначе выполнить проверку для следующего элемента, если он существует.

  4. В данном случае он не найден и следующий объект node не равен null.

  5. Если следующий объект node равен null, возвращаем null.

  6. Если следующий объект node не равен null, переходим к нему и повторяем первые три шага до тех пор, пока элемент не будет найден или следующий объект node не будет равен null.

Вывод:

История

Шифровка сообщений без возможности однозначной расшифровки, а только с целью подтверждения авторского приоритета, применялась издавна.

Галилео Галилей наблюдал кольца Сатурна, которые принял за «ушки». Не будучи уверен, но желая утвердить свой приоритет, он опубликовал сообщение с перестановленными буквами: smaismrmilmepoetaleumibunenugttauiras. В 1610 году он раскрыл исходную фразу: Altissimum planetam tergeminum obseruaui, что в переводе с латинского языка означает «высочайшую планету тройною наблюдал». Таким образом, на момент публикации первого сообщения исходная фраза не была раскрыта, но была создана возможность подтвердить её позже.

В середине 1650-х Христиан Гюйгенс разглядел кольца и опубликовал сообщение с буквами, расставленными по алфавиту: ааааааа, ссссс, d, еееее, g, h, iiiiiii, lllll, mm, nnnnnnnnn, oooo, pp, q, rr, s, ttttt, uuuuu. Через некоторое время была опубликована и исходная фраза: Annulo cingitur, tenui plano, nusquam cohaerente, ad eclipticam inclinato — «Окружен кольцом тонким, плоским, нигде не подвешенным, наклоненным к эклиптике». От применения хеш-функции, включая и цель позднее подтвердить некоторое нераскрытое сообщение, данный случай отличается только тем, что выходное сообщение не имеет фиксированной длины, а определяется длиной входного. Фактически, расстановка букв исходного сообщения по алфавиту является некоторой хеш-функцией, но только с результатом нефиксированной длины.

В январе 1953 года Ханс Петер Лун (нем. Hans Peter Luhn) (сотрудник фирмы IBM) предложил «хеш-кодирование». Дональд Кнут считает, что Ханс первым выдвинул систематическую идею «хеширования».

В 1956 году Арнольд Думи (англ. Arnold Dumey) в своей работе «Computers and automation» первым описал идею «хеширования» такой, какой её знает большинство программистов сейчас. Думи рассматривал «хеширование» как решение «проблемы словаря», предложил использовать в качестве «хеш-адреса» остаток от деления на простое число.

В 1957 году в журнале «IBM Journal of Research and Development» была опубликована статья Уэсли Питерсона (англ. W. Wesley Peterson) о поиске текста в больших файлах. Эта работа считается первой «серьёзной» работой по «хешированию». В статье Уэсли определил «открытую адресацию», указал на уменьшение производительности при удалении. Спустя шесть лет была опубликована работа Вернера Бухгольца (нем. Werner Buchholz), в которой было проведено обширное исследование «хеш-функций». В течение нескольких последующих лет «хеширование» широко использовалось, однако никаких значимых работ не публиковалось.

В 1967 году «хеширование» в современном значении упомянуто в книге Херберта Хеллермана «Принципы цифровых вычислительных систем». В 1968 году Роберт Моррис (англ. Robert Morris) опубликовал в журнале «Communications of the ACM» большой обзор по «хешированию». Эта работа считается «ключевой» публикацией, вводящей понятие о «хешировании» в научный оборот, и закрепившей термин «хеш», ранее применявшийся только специалистами (жаргон).

До начала 1990-х годов в русскоязычной литературе в качестве эквивалента термину «хеширование» благодаря работам Андрея Петровича Ершова использовалось слово «расстановка», а для «коллизий» использовался термин «конфликт» (А. П. Ершов использовал «расстановку» с 1956 года). В русскоязычном издании книги Никлауса Вирта «Алгоритмы и структуры данных» 1989 года также используется термин «расстановка». Предлагалось также назвать метод другим русским словом: «окрошка». Однако ни один из этих вариантов не прижился, и в русской литературе используется преимущественно термин «хеширование».

Варианты t1ha

Разработка t1ha преследовала сугубо практические цели. Первой такой целью было получение быстрой переносимой и достаточно качественной функции для построения хэш-таблиц.

Затем потребовался максимально быстрый вариант хэш-функции, который давал-бы сравнимый по качеству результат, но был максимально адаптирован на целевую платформу. Например, базовый вариант t1ha работает с little-endian порядком байт, из-за чего на big-endian архитектурах требуется конвертация с неизбежной потерей производительности. Так почему-бы не избавиться от лишних операций на конкретной целевой платформе? Таким же образом было добавлено ещё несколько вариантов:

  • Упрощенный вариант для 32-битных платформ, как little, так и big-endian.
  • Вариант с использованием инструкций AES-NI, но без AVX.
  • Два варианта с использованием инструкций AES-NI и AVX.

Чуть позже стало понятно, что потребуются ещё варианты, сконструированные для различных применений, включая разную разрядность результата, требования к качеству и стойкости. Такое многообразие потребовало наведения порядка. Что выразилось в смене схемы именования, в которой цифровой суффикс обозначает «уровень» функции:

  • — максимально быстрый вариант для текущего процессора.
  • — базовый переносимый 64-битный вариант t1ha.
  • — переносимый 64-битный вариант с чуть большей заботой о качестве.
  • — быстрый переносимый 128-битный вариант для получения отпечатков.
  • и т.д.

В этой схеме предполагается, что является диспетчером, который реализует перенаправление в зависимости от платформы и возможностей текущего процессора. Кроме этого, не исключается использование суффиксов «_le» и «_be» для явного выбора между little-endian и big-endian вариантами. Таким образом, под «вывеской» t1ha сейчас находится несколько хэш-функций и это семейство будет пополняться, в том числе с прицелом на отечественный E2K «Эльбрус».

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

Спасибо за внимание. Всем добра.English version is here

Зачем нужно знать Хеш- сумму файла?

Допустим, Вы решили скачать с торрента образ какой-то игры и весело провести время. Вот Вы нашли интересную игру, прочитали описание и обнаружили, что в описании к файлу указана «Хеш-Сумма» образа.

Дело в том, что человек, который выложил игру, он сначала проверял её на работоспособность на своём компьютере, может даже и на нескольких ПК и на разных системах.

Как только он убедился, что все отлично устанавливается и работает, он узнал «Хеш-Сумму» образа и указал её в описании к игре. У незнающих людей напрашивается вопрос, зачем он указала хеш -сумму образа?

Если говорить грубо, то: Хеш-сумма – это уникальный «Ключ» файла, который можно использовать для проверки файла, то есть, его целостности.

Если сказать ещё проще: То, хеш позволит нам сравнить два файла, тот файл, который был выложен для загрузки, с тем файлом, который был загружен на наш компьютер.

И зачем мне его сравнить? Допустим, Вы скачали образ и естественно принялись за установку игры. Но в процессе установки начали появляться какие-то ошибки, что-то идёт не так. Все признаки того, что игра не установится, так как это нужно, либо установилась, но не запускается.

В общем, существую подобные проблемы…

Конечно, можно обвинить во всех бедах то место, откуда качали файл. Мол, файл не качественный выложили, не чего не запускается, не чего не работает.

Но это может быть не так.
С системой все в порядке и с источником, откуда качался файл то же все в порядке.

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

Вот, отсюда все беды!

Идём на сайт, откуда качали файл, берём там хеш -сумму, после чего узнаём хеш скаченного файла и сравниваем их.

1) Если Хеш-Сумма оказывается разной, то соответственно загруженный файл 100% отличается от того, файла, который выложен на сайте. А это значит, загруженный файл работать не будет. Придётся скачать его заново.

2) Если Хеш-Суммы одинаковые, то в этом случаи была загружена точная копия файла, и она будет работать должным образом. Можно смело приступать к установке.

ВАЖНО! Если Вы качаете образы Windows то, после загрузки настоятельно рекомендую узнать хеш -сумму и сравнить её, если суммы не совпадут, то лучше раз 100 подумать, стоит ли ставить windowsс подобного образа. В общем и целом, думаю все понятно, если есть вопросы, то смело задавайте! Хорошо, разобрались, зачем нам нужна хеш -сумма файла, который собираемся качать

Теперь давайте узнаем, как сравнить хеш -сумму, что бы выяснить, полностью загрузился файл или нет

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

Особенности N-Hash

Однонаправленность

Определение: Пусть M{\displaystyle M} — сообщение некоторой длины.

Функция H{\displaystyle H} называется однонаправленной, если из равенства h=H(M){\displaystyle h=H(M)}

легко:

найти хеш-код h{\displaystyle h}, зная сообщение M{\displaystyle M}

очень трудоёмко:

  • найти сообщение M{\displaystyle M} по известному хеш-коду h{\displaystyle h} (т. е. если хеш-код пароля стал известен хакеру, то пароль он по нему не найдет);
  • найти отличное от M{\displaystyle M} сообщение M′{\displaystyle M’}, такое что их хеш-коды H(M′)=H(M){\displaystyle H(M’)=H(M)} совпадают.

Проще определение можно записать так:

Однонаправленность — это «отпечаток пальца»:

  • Если дан конкретный человек, то можно взять у него отпечаток пальца;
  • Невозможно найти человека по отпечатку его пальца (если нет базы данных с отпечатками пальцев всех людей, а её нет);
  • Невозможно найти второго человека с таким же как у другого отпечатком пальца.

Однонаправленность решает очень важную проблему. Рассмотрим её на примере.

Алиса и Боб традиционно обозначают субъектов передачи информации.
Примеры
  • Допустим, Алиса подписала контракт M{\displaystyle M} с известным Алисе и Бобу хеш-кодом h=H(M){\displaystyle h=H(M)}. Если бы H{\displaystyle H} была неоднонаправленная, то Боб мог бы найти такой другой контракт M′{\displaystyle M’}, что H(M′)=H(M){\displaystyle H(M’)=H(M)} и, значит, смог бы утверждать, что Алиса подписала M′{\displaystyle M’}.
  • Допустим, Алиса имеет один и тот же отпечаток пальца h с каким-нибудь преступником, тогда Боб смог бы утверждать, что этот преступник — Алиса.

Устойчивость к столкновениям

Чтобы предотвратить возможность Алисы использовать метод «дней рождения» для обмана Боба, очень удобно ввести ещё более сильное условие, чем условие однонаправленности.
H такова, что трудно найти сообщения M{\displaystyle M} и M′{\displaystyle M’}, такие что их хеш-коды H(M)=H(M′){\displaystyle H(M)=H(M’)} совпадают. То есть невозможно найти двух человек с одинаковыми отпечатками пальцев.

Данное условие называется устойчивостью к столкновениям и для хеш-функции N-Hash оно не выполняется.

По причине неустойчивости к столкновениям Алиса может обмануть Боба таким образом (метод «дней рождения»):

  • Алиса пишет две версии контракта: одна из них выгодна для Боба, а другая нет;
  • Внося небольшие изменения в каждый контракт (например, пробел заменяет на два пробела), она добьется того, что версий контрактов будет достаточно много для подбора M{\displaystyle M} и M′{\displaystyle M’}, для которых совпадают хеш-коды (версия M{\displaystyle M} выгодна Бобу, а M′{\displaystyle M’} — нет) (если в контракте 34 строки, то, внося или не внося изменения в каждую из строк, легко получить 234{\displaystyle 2^{34}} версий контрактов);
  • Теперь Алиса сможет доказать, что Боб подписал M′{\displaystyle M’}.

Для того, чтобы избежать подобной проблемы, достаточно вносить косметические изменения в подписываемый контракт. И хотя это действие никак не изменяет хеш-функцию H, а, значит, никак не влияет на её устойчивость к столкновениям, но человек этим действием получит новую версию контракта, хеш-код которого не совпадает с хеш-кодом версии контракта злоумышленника. То есть, если Боб в 5-й строке поставит в каком-нибудь месте запятую, или поставит две точки вместо одной, то Алиса не сможет доказать, что он подписал другой контракт (так как его хеш-код уже не совпадает с хеш-кодом контракта Алисы).

Можно рассмотреть жизненный пример: когда нотариус ставит печать в подписываемый контракт, он вносит туда косметические изменения.

Где и как применяется Хэш?

Как вы, вероятно, уже догадались Хэш применяется при решении очень многих задач. Вот несколько из них:

1. Пароли обычно хранятся не в открытом виде, а в виде Хэш-сумм, что позволяет обеспечить более высокую степень безопасности. Ведь даже если злоумышленник получит доступ к такой БД, ему еще придется немало времени потратить, чтобы подобрать к этим Хэш-кодам соответствующие тексты. Вот тут и важна характеристика «сложность восстановления исходных данных из значений Хэша».

Примечание: Советую ознакомиться со статьей пара советов для повышения уровня безопасности паролей.

2. В программировании, включая базы данных. Конечно же, чаще всего речь идет о структурах данных, позволяющих осуществлять быстрый поиск. Чисто технический аспект.

3. При передачи данных по сети (включая Интернет). Многие протоколы, такие как TCP/IP, включают в себя специальные проверочные поля, содержащие Хэш-сумму исходного сообщения, чтобы если где-то произошел сбой, то это не повлияло на передачу данных.

4. Для различных алгоритмов, связанных с безопасностью. Например, Хэш применяется в электронных цифровых подписях.

5. Для проверки целостности файлов

Если обращали внимание, то нередко в интернете можно встретить у файлов (к примеру, архивы) дополнительные описания с Хэш-кодом. Эта мера применяется не только для того, чтобы вы случайно не запустили файл, который повредился при скачивании из Интернета, но и бывают просто сбои на хостингах

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

6. Иногда, Хэш-функции применяются для создания уникальных идентификаторов (как часть). Например, при сохранении картинок или просто файлов, обычно используют Хэш в именах совместно с датой и временем. Это позволяет не перезаписывать файлы с одинаковыми именами.

7. И так далее.

На самом деле, чем дальше, тем чаще Хэш-функции применяются в информационных технологиях. В основном из-за того, что объемы данных и мощности самых простых компьютеров сильно возрасли. В первом случае, речь больше о поиске, а во втором речь больше о вопросах безопасности.

Программа HashTab: проверка хеш-суммы

Данная утилита является плагином, который интегрируется в операционную систему и используется в моменты надобности. Ее можно загрузить с официального сайта совершенно бесплатно в виде установочного файла. Инсталляция программы интуитивно понятна.

После установки в свойствах каждого файла будет присутствовать новая дополнительная вкладка для вычисления контрольной суммы. По умолчанию они будут вычисляться по тем самым трем алгоритмам, описанным выше.

Как проверить хеш-суммы? Для этого в поле «Сравнение» нужно вставить сумму, которая указана автором. Если скачанный файл успешно прошел проверку на подлинность, появится зеленая галочка. В противном же случае пользователь увидит красный крестик. В таком случае рекомендуется скачать файл заново.

Настройки на вкладке «Хеш-суммы файлов» можно поменять, если нажать на соответствующий пункт. Откроется окно параметров, где есть возможность выставить отображение нужных контрольных сумм для проверки и вычисления. Для того чтобы все было наглядным, рекомендуется отметить галочкой чекбокс, позволяющий показывать контрольные суммы строчными символами.

Таким образом, работать с данной программой очень просто. С ней сможет разобраться даже малоопытный пользователь.

Как работает проверка файлов?

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

Процесс генерации контрольной суммы часто называют однонаправленной криптографической функцией. Когда вы хешируете файл, он «суммируется» в строку случайных символов. Допустим, у вас есть документ, содержащий 1000 символов. Когда файл хешируется с помощью алгоритма MD5, итоговая контрольная сумма будет 32 случайных символа. Если вы хотите записать файл длиной 2000 символов, итоговая контрольная сумма MD5 будет равна 32 символам. Даже если исходный файл содержит всего 10 символов, контрольная сумма MD5 все равно будет состоять из 32 случайных символов.

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

Существует два типа контрольных сумм, которые обычно используются для проверки файлов, MD5 и SHA.

Алгоритм MD5 критикуют в мире шифрования за то, что его легко взломать, но это не относится к процедуре проверки файлов. Когда дело доходит до проверки целостности файла, слабость инструмента для шифрования не имеет значения. Это хорошо, потому что MD5 – зрелый инструмент, который быстрее других методов хеширует файлы.

В последнее время наблюдается рост популярности алгоритма хеширования SHA, поскольку этот алгоритм хеширования, используется в современном шифровании

Однако, в отличие от MD5, SHA имеет разные версии, и при проверке важно использовать правильную версию. Версия определяется порядковым номером (например 1, 2, 3), или количеством запусков SHA подряд (например 256, 384 или 512)

Контрольная сумма, которую вы используете, должна указывать, какую версию SHA использовать. Если на сайте хеш указан просто с пометкой SHA, без номера, то можно с уверенностью предположить, что нужно использовать SHA1.

Для проверки файлов оба метода одинаково хороши. Хотя алгоритмы отличаются, оба возвращают случайную строку заданной длины (хотя хеши MD5 короче любого из хешей SHA).

Примечание: Иногда для проверки файлов предоставляются подписи PGP/GPG. Такого рода подписи не очень распространены, и они более тщательно проверяются. Для этого нужно, чтобы вы загрузили контрольную сумму и открытый ключ сайта и чтобы настроили gpg в системе для выполнения проверки. Эти шаги выходят за рамки данной статьи.

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

Определение типа файла

Я думаю, тебе известно, что признак PE-файла в Windows — это не только расширение .exe, .dll, .drv или .sys. Внутри него содержатся и другие отличительные черты. Первая из них — это сигнатура из байт вида (или 0x4d, 0x5a в шестнадцатеричном представлении) в самом начале файла. Вторая — сигнатура также из двух байт и двух нулевых байтов следом (или 0x50, 0x45, 0x00, 0x00 в шестнадцатеричном представлении).

Смещение этой сигнатуры относительно начала файла записано в так называемом DOS-заголовке в поле , которое находится по смещению 0x3c от начала файла.

WWW

  • Описание формата PE на сайте Microsoft
  • «Исследуем Portable Executable» (Codeby.net)

По большому счету наличие этих двух сигнатур в файле и подходящее расширение свидетельствует о том, что перед нами именно PE-файл, однако при желании можно посмотреть еще значение поля Magic опционального заголовка (Optional Header). Это значение находится по смещению 0x18 относительно начала сигнатуры . Значение этого поля определяет разрядность исполняемого файла:

  • значение 0x010b говорит о том, что файл 32-разрядный (помни, что в памяти числа располагаются с обратной последовательностью байтов, сначала младший байт и далее старшие байты, то есть число 0x010b будет представлено последовательностью 0x0b, 0x01);
  • значение 0x020b говорит о том, что файл 64-разрядный.

Посмотреть это все можно несколькими способами. Первый — с помощью HEX-редактора.

Признаки PE-файла в HEX-редакторе Hiew

Второй — используя CFF Explorer или Exeinfo PE. Они наглядно показывают значения указанных сигнатур.

Третий способ — использовать возможности Python, запустив такой скрипт:

Или можешь использовать вот такое правило для Yara:

Поиск в VirusTotal по хешу

Отправить на VirusTotal для проверки можно не только сам файл, но и его хеш (md5, sha1 или sha256). В этом случае, если такой же файл уже анализировался, VirusTotal покажет результаты этого анализа, при этом сам файл на VirusTotal мы не засветим.

Думаю, как узнать хеш файла, ты прекрасно знаешь. В крайнем случае можно написать небольшой скрипт на Python:

Результат подсчета хеша шлем на VirusTotal либо применяем мои рекомендации из статьи «Тотальная проверка. Используем API VirusTotal в своих проектах» и автоматизируем этот процесс с помощью небольшого скрипта на Python.

Как видишь, скрипт получает значение хеша, переданного в виде аргумента командной строки, формирует все нужные запросы для VirusTotal и выводит результаты анализа.

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

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», увеличит личную накопительную скидку и позволит накапливать профессиональный рейтинг Xakep Score!
Подробнее

Я уже участник «Xakep.ru»

Рейтинг автора
5
Материал подготовил
Максим Иванов
Наш эксперт
Написано статей
129
Ссылка на основную публикацию
Похожие публикации