Я собираюсь поступить на 4-летнюю степень по информационной безопасности в Purdue. Для получения степени не требуются курсы программирования. Так что единственный раз, когда я смогу выбрать один, - это случайные факультативные занятия. Так что большую часть моего обучения я буду проводить самостоятельно. В начале последнего года обучения в старшей школе я решил полностью перейти на Linux. До сих пор я изучал некоторые вещи по Linux и безопасности. Однако я также считаю, что для меня будет важно выучить несколько языков программирования.
В основном я планирую научиться программировать параллельно с изучением того, как использовать Vim. Так что, скорее всего, это будет медленный процесс. В конце концов, я думаю, оно того стоит. Как я уже сказал, я занимаюсь безопасностью, поэтому в основном буду создавать приложения, связанные с безопасностью, большинство из которых будут связаны с сетью. Я также хотел бы начать разработку приложений для Android, но это будет позже.
С учетом сказанного у меня есть несколько идей. Я думал начать с JavaScript, потому что он кроссплатформенный, и я уже видел, как это предлагалось раньше. Я также много слышал о Ruby или мог бы пойти естественным путем Linux с C. В каком направлении мне двигаться?
В первую очередь: bash
вместе с общими утилитами командной строки. Bash
является пользовательским интерфейсом по умолчанию для операционной системы, и многие программы в системе Linux будут заключены в сценарий оболочки на каком-то уровне. Это может быть необычно, иметь некоторые особенности и часто кажется совершенно глупым, но с этим вам придется иметь дело, так что не бойтесь. Стандартные инструменты, такие как grep
, diff
, head
, tail
, sort
, uniq
и т. д., будут очень полезны не только при написании сценариев оболочки, но и для вашей продуктивности в командной строке.
Узнай хоть немного c
. Это то, на чем написаны самые низкие уровни системы, и это даст вам лучшее понимание системы в целом.
Выберите любой язык более высокого уровня, который вам нравится. Python
, ruby
, perl
, java
, что угодно - до тех пор, пока вам это нравится. Именно здесь вы действительно начинаете учиться "программировать", и с этого момента будет легче выучить больше языков, и Продолжай учиться.
Вы обнаружите, что каждый будет просто рекомендовать свой любимый язык. Мой любимый язык - Perl, поэтому я рекомендую его. :) Однако, помимо моих личных предпочтений, есть несколько веских причин, по которым вам стоит подумать об использовании perl:
Во-первых, perl - замечательный язык общего назначения. Начать работу с Perl легко, написав простые сценарии, чтобы делать то же самое, что и в сценариях оболочки, например, управлять файлами и принимать решения на основе ввода данных пользователем. Это обеспечивает очень легкое и постепенное введение в общие идеи программирования. Perl существует довольно давно, поэтому есть много ресурсов (книг и веб-сайтов) для начала.
Во-вторых, perl - невероятно мощный и выразительный язык, поддерживающий все современные возможности программирования. Я использую его уже более пятнадцати лет и все еще изучаю новые способы делать вещи более эффективно. Например, если вы хотите изучить объектно-ориентированное программирование, у Perl есть это (особенно через лось).
В-третьих, perl обладает почти бесконечной мощностью и гибкостью официального репозитория надстроек, CPAN. Например, чтобы следовать идее написания программного обеспечения безопасности, предположим, что вы хотите разработать какой-то собственный сканер сетевой безопасности. Вместо того, чтобы писать все это самостоятельно, вы можете начать с использования NMAP :: Сканер в качестве механизма сканирования, а затем напишите свои собственные настройки и улучшения в дополнение к этому.
Наконец, если вы хотите изучить веб-программирование, у Perl это тоже есть. Один из популярных современных способов написания веб-программ на Perl - это Катализатор, который предоставляет современную веб-платформу MVC для быстрой разработки веб-приложений любого типа.
Собирая все это вместе, преимущество perl состоит в том, что он позволяет вам начать с небольшого написания небольших скриптов и программ командной строки и постепенно перерасти в написание полнофункциональных современных приложений. Конечно, цена такой гибкости - сложность. Вы должны изучить и научиться делать что-то правильно, Perl не применяет передовые методы, как это делают другие языки. Мне лично нравится эта свобода, особенно в сочетании со всеми замечательными ресурсами в Интернете для обучения использованию Perl.
Три языка сослужат вам хорошую службу. В порядке убывания важности (т. Е. Первое является наиболее важным):
Вам следует выучить несколько языков. Я бы предложил начать с Python. Его широко рекомендуют из-за того, что он прост в освоении и очень полезен, множество отличных материалов для самостоятельного изучения доступно бесплатно, и, как я понимаю, он широко используется профессионалами в области ИТ-безопасности. Почти каждый раз, когда я вижу, как профессионалы безопасности публикуют демонстрационный код, это Python.
Я собираюсь поступить на 4-летнюю степень по информационной безопасности в Purdue. Для получения степени не требуются курсы программирования.
Я единственный, кто думает О боже !!!! с этой точки зрения?
Я также считаю, что для меня будет важно выучить несколько языков программирования.
Я бы так сказал. Хотя вы на самом деле не ожидаете стать опытным программистом, вам, вероятно, понадобятся навыки, необходимые для моделирования / воссоздания атак, и понимания того, как работает процесс программирования. Вам также потребуются навыки анализа данных и извлечения информации из массовых источников (например, журналов). JimB упомянул bash - и хотя вы, без сомнения, будете его использовать - для изучения основных битов требуется всего около пары часов. Фактически, единственное место, где вы, вероятно, когда-либо увидите bash, - это системы Linux, но другие оболочки очень похожи.
Я бы рекомендовал изучить awk и / или Perl для обработки данных. Не беспокойтесь о каких-либо требованиях ставить галочку в объектно-ориентированном поле, но я бы также рекомендовал взглянуть на непроцедурные языки.
Изучение C также предоставит вам много информации о том, как код превращается в исполняемую программу (компиляция - это всего лишь один шаг в очень сложном процессе).
Очевидным выбором для тех, кто интересуется разработкой для Android / мобильных устройств, будет java, но java изо всех сил пытается изолировать разработчика от необходимости иметь дело с реалиями работы и протоколов - по моему опыту, именно здесь возникают проблемы с безопасностью с Java Программы. то есть это может помочь вам в достижении вашей конечной цели и будет хорошо смотреться в вашем резюме, но не ожидайте, что изучение Java сильно дополнит ваши знания в области безопасности.
Мой совет:
bash
(и ему подобные) не являются языками программирования общего назначения. Хотя можно выполнить некоторые сложные сценарии в bash
это не лучший способ изучить программирование в целом. Это наиболее естественный способ выполнения задач системного администрирования, которые в первую очередь связаны с выполнением других программ, обработкой их файлов данных и каталогами и маршалингом ввода и вывода в них и из них. Если bash
молоток, оставьте его для проблем, которые действительно похожи на гвозди. Научиться делать что-нибудь нетривиальное в bash
будет значительно проще, если вы изучите несколько очень маленьких подмножеств sed
и awk
(поскольку манипуляции со строками в bash
во многом вдохновлен синтаксисом аналогичных операций в этих «маленьких» языках).Я действительно рекомендую вам прочитать вводный текст по C и потратить некоторое время на запуск strace
и ltrace
в некоторых простых служебных командах, например ls
и mkdir
и /bin/echo
и т.д. (на самом деле в наши дни я бы предложил ltrace -S
вместо strace
но набегает на вывод обеих команд и на ltrace
вывод, дополненный -S
вариант будет крайне познавательным).
C - это основной язык программирования, на котором написано ядро Linux и GNU libc. (Мелкие детали в сборке). Почти все программы в Linux (или другой UNIX-подобной) системе скомпонованы с библиотеками C (libc). Основные интерпретаторы Perl и Python (и большинство других языков сценариев) также написаны на C.Эти программы (ядро, общие системные библиотеки и различные интерпретаторы языка сценариев) написаны программистами на C, на их дизайн и функции сильно влияют их базовыми реализациями. Таким образом, более глубокое понимание любого из них в конечном итоге влечет за собой понимание C. Вам не нужно ничего знать о C ++ или Java, чтобы понимать программирование на этом уровне. (Каждый из них может быть интересен и необходим сам по себе в зависимости от вашего карьерного патча, но различия между C и C ++ и Java в значительной степени ортогональны использованию C для большинства программ и утилит вашей системы.
Итак, если вы согласны с моими предпосылками, мы свели это к выбору между Perl и Python.
Здесь начинаются настоящие огненные войны.
Мой совет - сначала сосредоточиться на Python (2.x). У Python относительно простой и последовательный синтаксис. Вы можете изучить основы Python синтаксис за несколько часов, и это большая часть синтаксиса, с которым вы когда-либо столкнетесь. Есть только несколько функций (понимание списков, выражения генератора, декораторы), которые вносят изменения в основной синтаксис. Таким образом, большая часть ваших усилий по изучению Python будет посвящена изучению обширных стандартных библиотек и попыткам найти «лучший» способ их использования (и выяснить, какие именно наборы исключений стоит обрабатывать, чтобы сделать ваши программы надежными). и, самое главное, в изучении основных понятий.
Я думаю, что у обширных библиотек Python и относительно простого синтаксиса есть два явных недостатка.
Во-первых, когда вы научитесь делать что-то на очень высоком уровне в Python, вам может показаться утомительной мысль о необходимости работать на более низком уровне. Там, где я работаю, Perl - это стандарт. Я прототипирую свою работу на Python, где я знаю, что могу заставить ее работать намного быстрее и надежнее, чем на Perl; тогда я боюсь пройти и портировать его на Perl для моих коллег. (Я был достаточно хорош в Perl за много лет до того, как я когда-либо использовал Python - так что это не вопрос простого знакомства).
Другой недостаток состоит в том, что иногда бывает трудно найти на Python самый высокий способ выполнить данную задачу. Например, чтобы получить веб-страницу, вы можете сначала попробовать сделать это с помощью сокетов низкого уровня ... что будет работать. Однако вы бы дублировали довольно много кода, который вы уже можете найти, включая в urllib
и / или urllib2
модули. Сам факт того, что стандартные библиотеки, начиная с версии 2.7.1, включают в себя обе из них, подчеркивает мою точку зрения. По возможности разработчики Python прозрачно расширили старые модули и API; однако есть десятки случаев, когда Python сохраняет два или три модуля, где прозрачное расширение по какой-то причине было невозможно. (В качестве другого примера вы можете посмотреть параметры синтаксического анализа параметров командной строки: argparse
, optparse
, и getopt
. Написание программ с использованием getopt
(самый старый из них). Для очень простых утилит с несколькими опциями и жестким соглашением о вызовах (например, используется только небольшой группой людей) нет ничего плохого в том, чтобы пройти sys.argv
сами. Однако обычно стоит внимательно прочитать документацию и перейти по ссылкам внизу старых модулей или модулей более низкого уровня, которые описывают доступные функции более нового или более высокого уровня.
Мой совет основан на моем мнении, что вы хотите сосредоточиться на более глубоких концепциях и не тратить много времени и усилий на синтаксические и языковые проблемы. Понимание того, когда использовать подпроцесс, а не поток, или функции многопроцессорной обработки, которые включены в Python, относительно мало связано с языком и все, что связано с навыками программирования, независимо от языка. (В тот момент, когда вы сможете понять аргументы о модели Twisted, управляемой событиями, по сравнению с потоками и многопроцессорностью, вы, вероятно, освоите Python и будете готовы программировать на любом языке).
Контраргумент в пользу Perl прост и практичен. Есть еще немало работ, требующих, в частности, навыков работы с Perl. Perl - мощный язык с чрезвычайно обширными библиотеками. (Ядро Perl, которое распространяется с большинством систем Linux, охватывает меньший диапазон функций, чем стандартные библиотеки Python; предполагается, что вы установите значительное количество дополнительных пакетов из вашего дистрибутива или через CPAN - всеобъемлющий архив Perl Сеть). (Напротив, меньше модулей и пакетов Python, которые мне нужно получить отдельно ... они доступны в PyPI - указателе пакетов Python).
Итак, если вы изучите Perl, у вас будет преимущество в поиске работы, особенно работы системного администратора, в краткосрочной перспективе. Однако синтаксис Perl ... ну ... по словам некоторых из его энтузиастов ... "патологически эклектичен!" Perl может быть очень кратким, а его код содержит довольно много знаков препинания. Те, кто любит это, будут бесконечно спорить, что это «легко» и имеет смысл - и будут иметь бесконечные возможности сделать это на форумах, которые полны путаницы относительно того, как именно был интерпретирован данный фрагмент кода. Синтаксис и язык, используемый в документации и теми, кто поддерживает его на публичных форумах, имеют нюансы до такой степени, что вы можете потратить значительные усилия на их изучение.
Теперь поймите, пожалуйста, что этот предыдущий комментарий субъективен и предвзят. Возможно, вы попробуете Perl и найдете его синтаксис интуитивно понятным и приятным. Если так, то больше власти вам. Однако я лично нахожу, что мое понимание особенностей Perl очень быстро распадается. Основы я сохраняю, но нахожу борьбу всякий раз, когда мне приходится возвращаться к нему для более чем нескольких строк кода.
Есть много других языков, которые вы хотели бы изучить: Java, Lisp и Scheme, TCL, Scala и так далее. Однако я бы посоветовал начать с того, которое предлагает лучший баланс между полезностью и простотой.
В мире Linux вы должны знать две основные вещи:
Regular Expression
. Это обязательно. RegEx
это универсальный "язык", когда вы научитесь использовать регулярные выражения, ваша жизнь станет намного проще :-)quick & dirty
"очень распространено в мире Linux. Если вы можете выполнить свою работу, независимо от того, насколько уродливым является ваше решение, ваша работа сделана.Итак, если вы хотите выучить язык в Linux, вы ДОЛЖЕН выберите script language
, лайк python
, PHP
, или даже bash scripting
.
И я рекомендую PHP
. Это просто и некрасиво. В нем подробно онлайн-руководство. Это хорошо RegEx
служба поддержки. Вот и все.
Вы можете выполнять практически любую задачу практически на любом языке, поэтому правильный выбор в значительной степени продиктован решаемой проблемой.
Определенно стоит знать языки из следующих категорий:
Я бы попытался изучить C / C ++, так как это позволяет повреждать стек и получать прямой доступ к памяти. Это важно, если вы хотите поэкспериментировать с проблемами безопасности. Многие языки имеют синтаксис, подобный C (включая JavaScript), так что это хороший трамплин.
Если вы много работаете в оболочке, что, как я полагаю, вы делаете, когда изучаете vim, вы в конечном итоге изучите базовые сценарии оболочки в качестве побочного эффекта. UNIX Power Tools - хорошая книга для изучения более сложных вещей; Я не знаю, публикуется ли он еще.
PHP также может быть хорошим языком для изучения; Основное преимущество, которое он предлагает новым программистам, заключается в том, что многие функции встроены, а не в библиотеке, на которую нужно ссылаться (что не является сложной задачей). Из-за этого просмотр основных документов научит вас много вещи.
Во-первых, негативный совет:
По сути, я планирую научиться программировать параллельно с изучением того, как использовать Vim.
Не делай этого. Найдите действительно удобный редактор. Изучить и язык, и редактор втрое сложнее, чем выучить их по порядку (очевидно, что редактор должен идти первым :-))
Как я уже сказал, я собираюсь заняться безопасностью, поэтому буду создавать в основном приложения, связанные с безопасностью. Большинство из них будут связаны с сетями.
Приложения безопасности, связанные с сетью? C здесь нетрудно выбрать. Вам нужно будет получить доступ к сети на уровне системного API, а это значит, что C - лучший вариант. Конечно, это не означает, что все должно быть на C - библиотека C + $favorite-high-level-language
wrapper может избавить вас от проблем, связанных с C, в тех частях, которые не нуждаются в C.
С учетом сказанного у меня есть несколько идей. Я думал начать с JavaScript, потому что он кроссплатформенный, и я уже видел, как это предлагалось раньше.
Бьюсь об заклад, это было предложено в контексте, отличном от вашего. У JavaScript есть свои сильные стороны, но пока он не является хорошим языком общего назначения. JS не имеет стандартных библиотек, сопоставимых с теми, что доступны для C, Python, Perl, Ruby, Java и других компаний.
Говоря о $favorite-high-level-language
- Мой совет - использовать Python. Он хорошо взаимодействует с C, поставляется с множеством полезных библиотек и имеет гораздо больше библиотек, доступных в виде надстроек.
Нет ничего плохого в изучении Javascript, но он работает только в браузере, поэтому ваше программирование будет ограничено приложениями, связанными с веб-страницами.
Ответов на вопрос «с какого языка программирования лучше всего» существует, вероятно, столько же, сколько и языков. Я ценю то, что вы могли бы сделать хуже, чем начинать с базовых сценариев оболочки, просто посмотреть, что вы можете сделать для автоматизации задач, не используя ничего, кроме оболочки, а затем расширить это с помощью Perl или аналогичного языка, который вырос из необходимости делать задачи более сложные, чем способна оболочка, после этого, и если вы действительно заинтересованы, это займет всего несколько недель, начните использовать C или производную.
Мои рекомендации? Хммм. Что ж, вам, возможно, придется решать по ходу дела. Для здорового и всестороннего обучения вы можете пойти обычным путем для получения степени CS, возможно, не в этом порядке.
(1) C / C ++ - вы можете отказаться от объектно-ориентированного кода, и, по крайней мере, вы попробуете. C ++ - это «профессиональный» стандарт. (2) Сборка (ненадолго - это поможет вам понять реальную работу процессора, памяти и т. Д. - вам не нужно жениться на ней.) (3) Python / Perl / Bash - получите эти языков сценариев, они будут наиболее полезны для вашего уровня Linux (4) PHP / Ruby, MySQL и HTML - Просто начните программировать в Интернете! Вы поймете весь процесс взаимодействия сервера и клиента, другой уровень вычислений.
Нужны полезные концепции? AI, нейронные сети. Они должны вас окружить.
Вы можете выбрать одно из них или коснуться их всех. Мой язык? Все они по мере необходимости, но я занимаюсь программированием с 1984 года, у меня есть степень CS, написанные игры и всевозможные приложения для встроенных систем. Это то, что я делаю. Вам нужно узнать, кто вы и чем занимаетесь. Просто убедитесь, что вам весело.
Наслаждайтесь!
упс, неверно истолковал информационную безопасность для информационных систем ... да ладно, большая часть этого все еще применима
Ява
Честно говоря, если вы работаете в Linux и проходите начальный курс программирования на Java, а затем, возможно, пройдите еще пару курсов программирования, другие инструменты, такие как Bash sed / awk и т. Д., Должны как бы встать на свои места. Если вы действительно вникнете в системы, вы, возможно, возьмете немного C позже, но я бы не сказал, что он пользуется большим спросом, и я бы даже не сказал, что это требование системного специалиста - если вы действительно не разбираетесь во внутренностях.
YMMV