Estoy a punto de comenzar un grado de seguridad de la información de 4 años en Purdue. El título no requiere ningún curso de programación. Entonces, la única vez que podré tomar una es la electiva ocasional. Así que la mayor parte de mi aprendizaje será por mi cuenta. Al comienzo de mi último año de secundaria, decidí cambiarme completamente a Linux. Hasta ahora he estado aprendiendo algunas cosas de Linux y seguridad. Sin embargo, también creo que será importante para mí también aprender algunos lenguajes de programación.
Básicamente estoy planeando aprender a programar lado a lado con aprender a usar Vim. Por lo tanto, lo más probable es que sea un proceso lento. Al final creo que valdrá la pena. Como dije, voy a entrar en la seguridad, por lo que principalmente crearé aplicaciones relacionadas con la seguridad, la mayoría de las cuales estarán relacionadas con la red. También me gustaría comenzar a desarrollar aplicaciones de Android, pero eso será más adelante.
Dicho esto, tengo algunas ideas. Estaba pensando en comenzar con JavaScript, porque es multiplataforma, y lo he visto sugerido antes. También he estado escuchando mucho sobre Ruby o podría seguir la ruta natural de Linux con C. ¿Qué dirección debo tomar?
Encontrará que todo el mundo recomendará su idioma favorito. Mi idioma favorito es Perl, así que eso es lo que recomiendo. :) Sin embargo, más allá de mi preferencia personal, hay algunas buenas razones por las que deberías considerar usar Perl:
Primero, perl es un maravilloso lenguaje de propósito general. Es fácil comenzar en perl escribiendo scripts simples para hacer el mismo tipo de cosas que hace en scripts de shell, como manipular archivos y tomar decisiones basadas en la entrada del usuario. Esto proporciona una introducción muy fácil y gradual a las ideas generales de programación. Perl ha existido durante bastante tiempo, por lo que hay muchos recursos (libros y sitios web) para comenzar.
En segundo lugar, Perl es un lenguaje increíblemente potente y expresivo que admite todas las funciones de programación modernas. Lo he estado usando durante más de quince años y todavía estoy aprendiendo nuevas formas de hacer las cosas de manera más eficiente. Por ejemplo, si desea explorar la programación orientada a objetos, Perl tiene eso (particularmente a través de Moose ).
Tercero, perl viene con el poder y la flexibilidad casi infinitos de su repositorio de complementos oficial, CPAN . Por ejemplo, para seguir la idea de escribir software de seguridad, digamos que desea desarrollar algún tipo de escáner de seguridad de red personalizado. En lugar de escribir todo eso usted mismo, puede comenzar usando NMAP :: Scanner como motor de escaneo, y luego escribir sus propios ajustes y mejoras además de eso.
Finalmente, si desea explorar la programación web, Perl también lo tiene. Una forma moderna y popular de escribir software web en Perl es Catalyst , que proporciona un marco web MVC moderno para desarrollar rápidamente cualquier tipo de aplicación web.
En conjunto, la ventaja de perl es que le permite comenzar a escribir pequeños scripts y programas de línea de comandos, y gradualmente convertirse en aplicaciones modernas con todas las funciones. Por supuesto, el precio de esta flexibilidad es la complejidad. Depende de usted estudiar y aprender a hacer las cosas de la manera correcta, perl no impone buenas prácticas como lo hacen otros idiomas. Personalmente, me gusta esta libertad, especialmente junto con todos los excelentes recursos en la web para aprender a usar perl.
fuente
Tres idiomas te mantendrán en buen lugar. En orden decreciente de importancia (es decir, el primero es el más importante):
fuente
script language
, comopython
oPHP
.Deberías aprender varios idiomas. Sugeriría comenzar con Python. Se recomienda ampliamente por ser fácil de aprender y por ser muy útil, hay muchos excelentes materiales de autoaprendizaje disponibles de forma gratuita, y creo que los profesionales de seguridad de TI lo utilizan ampliamente. Casi cada vez que veo profesionales de seguridad que publican código de demostración, es Python.
fuente
¿Soy el único en pensar OMG! ¿en este punto?
Yo diría que sí. Aunque realmente no espera convertirse en un programador competente, probablemente necesite las habilidades necesarias para simular / recrear ataques y comprender cómo funciona el proceso de programación. También necesitará las habilidades para analizar datos y extraer información de fuentes masivas (como registros). JimB ha mencionado bash, y aunque sin duda usará esto, solo toma alrededor de un par de horas aprender los bits esenciales. En realidad, el único lugar en el que es probable que veas bash es en los sistemas Linux, pero los otros shells son muy similares.
Recomiendo aprender awk y / o Perl para el procesamiento de datos. No se preocupe por ningún requisito para marcar una casilla orientada a objetos, pero también recomendaría mirar idiomas no procesales.
Learning C también lo expondrá a mucha información sobre cómo el código se convierte en un programa ejecutable (compilar es solo un paso en un proceso muy complejo).
La opción obvia para alguien interesado en el desarrollo de Android / dispositivos móviles sería Java, pero Java se esfuerza mucho por aislar al desarrollador de tener que lidiar con las realidades del funcionamiento y los protocolos; es mi experiencia que aquí es donde tiene problemas de seguridad con Java aplicaciones es decir, podría ayudarlo a lograr su objetivo final, y se verá bien en su CV, pero no espere que aprender Java complemente mucho su conocimiento de seguridad.
fuente
Mi consejo:
bash
(y sus características) no son lenguajes de programación de propósito general. Si bien es posible lograr algunos scripts sofisticadosbash
, no es la mejor manera de aprender programación en general. Es la forma más natural de realizar tareas de administración de sistemas que giran principalmente en torno a la ejecución de otros programas, el manejo de sus archivos de datos y directorios y la organización de entradas y salidas hacia y desde ellos. Sibash
es un martillo, resérvelo para problemas que realmente se parecen a las uñas. Aprender a hacer cualquier cosa que no sea trivialbash
será considerablemente más fácil si aprende algunos subconjuntos muy pequeños de (sed
yawk
dado que la manipulación de cadenasbash
se inspira en gran medida en la sintaxis de operaciones similares en estos "pequeños" lenguajes).Yo te recomiendo que lea un texto introductorio sobre C y pasar algún tiempo en marcha del
strace
yltrace
comandos en algunos comandos simples como servicios públicosls
ymkdir
y/bin/echo
etc (en realidad en estos días me gustaría sugerirltrace -S
en lugar destrace
, pero incursiones en la salida de ambos comandos y en laltrace
salida aumentada por la-S
opción será extremadamente educativa).C es el lenguaje de programación principal en el que se escriben el kernel de Linux y la libc de GNU. (Las piezas pequeñas están en ensamblaje). Casi todos los programas en un sistema Linux (u otro sistema similar a UNIX) están vinculados con las bibliotecas C (libc). Los principales intérpretes de Perl y Python (y la mayoría de los otros lenguajes de scripting) también están escritos en C. Estos programas (el núcleo, las bibliotecas comunes del sistema y los diversos intérpretes de scripting language) están escritos por programadores en C, su diseño y características están fuertemente influenciadas por sus implementaciones subyacentes. Por lo tanto, una comprensión más profunda de cualquiera de estos eventualmente implica comprender C. No necesita saber nada sobre C ++ ni Java para comprender la programación a este nivel. (Es posible que cada uno sea interesante y necesario por derecho propio según el parche de su carrera,
Entonces, si está de acuerdo con mis premisas hasta ahora, lo hemos reducido a una elección entre Perl y Python.
Aquí es donde comienzan las verdaderas guerras de llamas.
Mi consejo es centrarse primero en Python (2.x). Python tiene una sintaxis relativamente simple y consistente. Puede aprender los conceptos básicos de la sintaxis de Python en unas pocas horas y esa es la gran mayoría de la sintaxis que encontrará. Hay solo unas pocas características (comprensión de listas, expresiones generadoras, decoradores) que son arrugas a la sintaxis básica. Por lo tanto, la mayor parte de su esfuerzo en aprender Python se dedicará a aprender las extensas bibliotecas estándar y tratar de encontrar la "mejor" manera de usarlas (y descubrir cuáles son los conjuntos específicos de excepciones que vale la pena manejar para hacer que sus programas sean robustos) y, lo más importante, en el aprendizaje de los conceptos subyacentes.
Creo que las bibliotecas extensas de Python y su sintaxis relativamente simple tienen dos desventajas distintas.
En primer lugar, a medida que aprende a hacer cosas en un nivel muy alto en Python, puede ser tedioso pensar en tener que trabajar en un nivel inferior. Donde trabajo Perl es el estándar. Prototipo mi trabajo en Python, donde sé que puedo hacer que funcione mucho más rápido y confiable que en Perl; entonces temo tener que pasar y portarlo a Perl para mis colegas. (Fui razonablemente bueno en Perl años antes de usar Python, así que no es una cuestión de simple familiaridad).
La otra desventaja es que a veces es difícil encontrar la forma de más alto nivel para realizar una tarea determinada en Python. Por ejemplo, para buscar una página web, puede intentar hacerlo inicialmente con sockets de bajo nivel ... lo que funcionará. Sin embargo, estaría duplicando bastante código que ya puede encontrar incluido en los módulos
urllib
y / ourllib2
. El hecho mismo de que las bibliotecas estándar, a partir de 2.7.1, incluye ambos, hace mi punto. Donde sea posible, los mantenedores de Python han extendido los módulos y API más antiguos de manera transparente; Sin embargo, hay docenas de casos en los que Python retiene dos o tres módulos donde la extensión transparente no fue posible por alguna razón. (Para otro ejemplo usted podría mirar a las opciones para analizar las opciones de línea de comandos:argparse
,optparse
ygetopt
. Hay poco daño al escribir sus programas usandogetopt
(el más antiguo de estos). Para utilidades muy simples con pocas opciones y una convención de llamada rígida (utilizada solo por un pequeño grupo de personas, por ejemplo), entonces no hay nada inherentemente malo en caminar sobresys.argv
ti mismo. Sin embargo, por lo general, vale la pena leer los documentos detenidamente y seguir los enlaces en la parte inferior de los módulos de nivel anterior o inferior que describen las características disponibles más nuevas o de nivel superior.Mi consejo se basa en mi opinión de que desea centrarse en conceptos más profundos y no tener que gastar gran parte de su tiempo y esfuerzo en cuestiones sintácticas y específicas del idioma. Comprender cuándo usar un subproceso, frente a un hilo, o las funciones de procesamiento múltiple que se incluyen con Python tiene relativamente poco que ver con el lenguaje y todo lo que tiene que ver con el dominio de la programación, independientemente del idioma. (En el punto en el que pueda comprender los argumentos sobre el modelo impulsado por eventos de Twisted en comparación con el subprocesamiento y el multiprocesamiento, entonces probablemente habrá dominado Python y estará listo para programar en cualquier lenguaje).
El argumento contrario, para Perl, es simple y práctico. Hay bastantes trabajos más que requerirán, específicamente, habilidades con Perl. Perl es un lenguaje poderoso y tiene bibliotecas extremadamente extensas. (El núcleo de Perl que se distribuye con la mayoría de los sistemas Linux cubre una gama de funcionalidades más pequeña que las bibliotecas Python estándar; se supone que habrá instalado un número significativo de paquetes adicionales desde su distribución o a través de CPAN --- el archivo completo de Perl Red). (Por el contrario, hay menos módulos y paquetes de Python que tengo que buscar por separado ... están disponibles en PyPI --- el Índice de paquetes de Python).
Por lo tanto, si aprende Perl, tendrá una ventaja para encontrar trabajos, en particular trabajos de administrador de sistemas, a corto plazo. Sin embargo, la sintaxis de Perl es ... bueno ... en palabras de algunos de sus propios entusiastas ... "patológicamente ecléctico". Perl puede ser extremadamente conciso y su código está lleno de bastante puntuación. Quienes lo aman argumentarán sin cesar que es "fácil" y tiene mucho sentido --- y tendrán infinitas oportunidades para hacerlo en foros que están llenos de confusión sobre cómo exactamente se interpretó un fragmento de código. La sintaxis y el lenguaje utilizado en la documentación y por aquellos que la apoyan en foros públicos están matizados hasta el punto de que puede dedicar un esfuerzo considerable para aprenderlos.
Ahora, tenga en cuenta que este comentario anterior es subjetivo y sesgado. Es posible que pruebe Perl y descubra que su sintaxis es intuitiva y agradable. Si es así, más poder para ti. Sin embargo, personalmente encuentro que mi comprensión de las idiosincrasias de Perl decae muy rápidamente. Los fundamentos que conservo, pero encuentro que es una lucha cada vez que tengo que volver a usarlo por más de unas pocas líneas de código.
Hay muchos otros idiomas que estudiaría, Java, Lisp y Scheme, TCL, Scala, etc. Sin embargo, sugeriría comenzar con uno que ofrezca el mejor equilibrio entre utilidad y simplicidad.
fuente
En el mundo Linux, debes saber dos cosas básicas:
Regular Expression
. Es un requisito.RegEx
es un "lenguaje" universal, una vez que sepa cómo usar la expresión regular, su vida será mucho más fácil :-)quick & dirty
" es muy común en el mundo Linux. Si puede hacer su trabajo, no importa cuán fea sea su solución, tiene su trabajo hecho.Por lo tanto, si quieres aprender un idioma en Linux, DEBE elegir un
script language
, comopython
,PHP
o inclusobash scripting
.Y, mi recomendación es
PHP
. Es simple y feo. Tiene un manual en línea detallado . Tiene buenRegEx
soporte. Eso es todo.fuente
Puede realizar casi cualquier tarea en casi cualquier idioma, por lo que la elección correcta depende en gran medida del problema que esté resolviendo.
Definitivamente vale la pena conocer idiomas de las siguientes categorías:
Me esforzaría por aprender C / C ++, ya que esto permite la corrupción de la pila y el acceso directo a la memoria. Esto es importante si desea experimentar con problemas de seguridad. Muchos lenguajes tienen una sintaxis tipo C (incluido JavaScript), por lo que es un buen trampolín.
Si está trabajando mucho en un shell, lo que supongo que es mientras aprende vim, terminará aprendiendo scripts básicos de shell como efecto secundario. UNIX Power Tools fue un buen libro para aprender cosas más avanzadas; No sé si aún está publicado.
PHP también puede ser un buen lenguaje para aprender; La principal ventaja que ofrece a los nuevos programadores es que se incorpora una gran cantidad de funcionalidades, en lugar de en una biblioteca a la que tendrías que vincular (lo cual no es una tarea compleja). Debido a esto, navegar por los documentos principales te enseñará sobre muchas cosas.
fuente
Primero, algunos consejos negativos:
No hagas eso. Encuentre un editor que sea realmente cómodo. Aprender tanto el idioma como el editor es tres veces más difícil que aprenderlos en orden (obviamente, el editor debe ir primero :-))
¿Aplicaciones de seguridad relacionadas con redes? C es una elección obvia aquí. Deberá acceder a la red en el nivel API del sistema, lo que significa que C es el camino a seguir. Por supuesto, esto no significa que todo deba estar en C: una biblioteca de C + un
$favorite-high-level-language
contenedor podría ahorrarle las molestias relacionadas con C en partes que no necesitan C.Apuesto a que fue sugerido en un contexto diferente al tuyo. JavaScript tiene sus puntos fuertes, pero aún no es un buen lenguaje de propósito general. JS no tiene bibliotecas estándar comparables a las disponibles para C, Python, Perl, Ruby, Java y compañía.
Hablando de eso
$favorite-high-level-language
, mi consejo es ir con Python. Se interconecta muy bien con C, se entrega con muchas bibliotecas útiles y tiene muchas más bibliotecas disponibles como complementos.fuente
No hay nada de malo en aprender Javascript, pero solo se ejecuta en un navegador, por lo que su programación se limitará a las aplicaciones relacionadas con la página web.
Probablemente hay tantas respuestas a "cuál es un buen lenguaje de programación para comenzar" como idiomas. Mi valor de tuppence es que podría hacer algo peor que comenzar con un script de shell básico, solo ver lo que puede hacer para automatizar tareas sin usar nada más allá del shell, luego extender eso usando Perl, o un lenguaje similar que surgió de la necesidad de hacer tareas más complejas de las que es capaz el shell, después de eso, y si está realmente interesado, solo tomará unas pocas semanas, comience a usar C o un derivado.
fuente
Mis recomendaciones Hmmm Bueno, puede que tenga que decidir sobre la marcha. Para el rango completo y completo, puede seguir la ruta habitual de grado CS, tal vez no en este orden.
(1) C / C ++: puede obtener las cosas orientadas a objetos, y al menos lo habrá intentado. C ++ es el estándar 'profesional'. (2) Ensamblaje (solo por un momento, lo ayudará a comprender el funcionamiento real del procesador, la memoria, etc., no tiene que casarse con él). (3) Python / Perl / Bash - Obtenga estos con los lenguajes de scripting reducidos, serán más útiles para su nivel de Linux (4) PHP / Ruby, MySQL y HTML. ¡Simplemente inicie su programación web! Entenderá todo el proceso de interacción servidor-cliente, otro nivel de computación.
¿Necesitas conceptos útiles? AI, redes neuronales. Estos deberían redondearlo.
Puede elegir uno de estos para hacer o tocar todos. ¿Mi idioma? Todos ellos, según sea necesario, pero he estado programando desde 1984 y tengo un título de CS, juegos escritos y todo tipo de aplicaciones de sistemas integrados. Es lo que hago. Necesitas saber quién eres y qué haces. Solo asegúrate de divertirte.
¡Disfrutar!
fuente
¡Uy !, seguridad de la información errónea para los sistemas de información ... bueno, la mayor parte de esto todavía se aplica
Java
Honestamente, si está trabajando en Linux y toma un curso de programación inicial en Java, y luego puede seguir con un par de cursos de programación más, las otras herramientas como Bash sed / awk, etc., deberían encajar. Si realmente te metes en los sistemas, podrías tomar algo de C más tarde, pero no diría que tiene una gran demanda y ni siquiera diría que es un requisito para ser un tipo de sistemas, a menos que realmente te interesen las partes internas.
YMMV
fuente