Durante un período de tiempo, una gran cantidad de sitios web sufrió violaciones de datos contraseña de usuario, que incluye las principales empresas de internet - Linkedin.com, CSDN.net, el evento arrastrado por toda la Internet en el hogar, y luego llegó a más de 8 millones de usuarios jugar Información juegos se filtró, otro a todos los rumores, la red feliz, una comunidad distante, siglo buen margen, red Lily y otras comunidades pueden llegar a ser los próximos hackers de destino. El sinfín de eventos similares a la vida en línea del usuario un gran impacto, se sienten inseguros, porque la gente tiende hábito de usar la misma contraseña para diferentes sitios, por lo que una "Biblioteca violenta", todos sufren.
Así que, como desarrollador de aplicaciones web, la elección del esquema de almacenamiento de contraseñas, que es fácil caer en las trampas y cómo evitar estas trampas?
Actualmente, el esquema de almacenamiento de la contraseña más utilizada es la de hacer de un solo sentido contraseñas en texto plano y almacenarlos después, hay un solo sentido en las características del algoritmo: no se puede resumir y recuperar los datos originales, que es en "One-way" dos palabra de origen. Algoritmos hash unidireccionales usados comúnmente incluyen SHA-256, SHA-1, MD5 y así sucesivamente.
Go tiene tres algoritmo de cifrado, son los siguiente:
//import "crypto/sha256"
h := sha256.New()
io.WriteString(h, "His money is twice tainted: 'taint yours and 'taint mine.")
fmt.Printf("% x", h.Sum(nil))
//import "crypto/sha1"
h := sha1.New()
io.WriteString(h, "His money is twice tainted: 'taint yours and 'taint mine.")
fmt.Printf("% x", h.Sum(nil))
//import "crypto/md5"
h := md5.New()
io.WriteString(h, "需要加密的密码")
fmt.Printf("%x", h.Sum(nil))
Hay dos funciones de hash de un solo sentido:
- on un hash unidireccional de la contraseña, el resumen resultante siempre se determina de forma única.
- la velocidad de cálculo. Como la tecnología avanza, un segundo para completar miles de millones de cálculos de hash de un solo sentido
La combinación de las dos características anteriores, teniendo en cuenta la mayoría de las personas están usando una combinación de contraseña común, el atacante puede ser una combinación de todo lo común password hash unidireccional, obtener una combinación de resumen y, a continuación un resumen de la base de datos para comparación para obtener la contraseña correspondiente. Esta composición abstracta es también conocida como rainbow table
.
Por lo tanto, después de un cifrado de un solo sentido de los datos almacenados, y se almacena en texto sin formato no es mucha diferencia. Por lo tanto, una vez que la base de datos de sitio de fuga, la propia contraseña de todo el usuario se revela al mundo.
A través de la descripción anterior, sabemos que los hackers pueden utilizar la tabla de arco iris para descifrar contraseñas con algoritmo hash, en gran parte debido a que el algoritmo de hash utilizado para cifrar es público. Si un hacker no sabe qué algoritmo de cifrado hash, que no va a poner en marcha.
Una solución inmediata es diseñar su propio algoritmo hash. Sin embargo, un buen algoritmo hash es muy difícil diseñar - tanto para evitar la colisión, pero también no se puede tener la regla obvia, estos dos puntos a ser mucho más difícil de lo esperado. Por lo tanto, las aplicaciones más prácticas es el uso de muchos algoritmo hash de hash existentes.
Pero hachís simplemente repetido, todavía no podía detener a los hackers. Dos veces MD5, MD5 tres de estos métodos, podemos imaginar, los hackers pueden pensar de forma natural. Especialmente para una parte del código fuente abierto, por lo que es equivalente al algoritmo hash directamente a decirle a un usuario remoto.
No se escudo inatacable, pero no hay ninguna fuera constantemente lanza. Ahora la seguridad es relativamente buena página, utilizará una técnica llamada forma "sal" para almacenar contraseñas, a menudo se dice que "la sal". Su práctica habitual consiste en realizar primero una contraseña introducida por el usuario MD5 (u otro algoritmo de hash) de cifrado; Valores de MD5 serán sólo un administrador antes de que sepan más alguna cadena aleatoria y, a continuación, realizar una encriptación MD5. La cadena aleatoria puede ser incluido en cierta cadena fija, y puede incluir el nombre de usuario (usado para asegurar que cada usuario no es la misma clave de cifrado utilizada).
//import "crypto/md5"
// Assume the username abc, password 123456
h := md5.New()
io.WriteString(h, "password need to be encrypted")
pwmd5 :=fmt.Sprintf("%x", h.Sum(nil))
// Specify two salt: salt1 = @#$% salt2 = ^&*()
salt1 := "@#$%"
salt2 := "^&*()"
// salt1 + username + salt2 + MD5 splicing
io.WriteString(h, salt1)
io.WriteString(h, "abc")
io.WriteString(h, salt2)
io.WriteString(h, pwmd5)
last :=fmt.Sprintf("%x", h.Sum(nil))
En dos de sal no reveló las circunstancias, si el hacker es el último de conseguir la cadena cifrada, es casi imposible de averiguar lo que la contraseña original.
Soluciones avanzadas anteriormente hace unos años puede ser lo suficientemente seguro como solución, ya que el atacante no tiene suficientes recursos para construir tantas rainbow table
. Sin embargo, hasta el momento, debido a que las capacidades de computación paralelas de la actualización, este ataque ha sido completamente factible.
¿Cómo resolver este problema? Siempre y cuando el tiempo y los recursos lo permitan, sin contraseña no puede ser descifrado, por lo que la solución es: Calcular la contraseña necesaria aumentar deliberadamente los recursos y el tiempo que consume, por lo que nadie con recursos suficientes para establecer la necesaria rainbow table
.
Estos programas tienen una característica, el algoritmo tiene un factor utilizado para calcular la síntesis de la contraseña necesaria para indicar los recursos y el tiempo, que es computacionalmente intensivas. Cuanto mayor es la intensidad de cálculo, un atacante establece tabla de arco iris más difícil, por lo que no puede continuar.
Se recomienda scrypt programa, Scrypt por el famoso hacker de Colin Percival del servicio de copia de seguridad de FreeBSD Tarsnap por su desarrollo.
Ir idioma que está soportado actualmente por la biblioteca http://code.google.com/p/go/source/browse?repo=crypto # hg% 2Fscrypt
dk: = scrypt.Key([]byte("some password"), []byte(salt), 16384, 8, 1, 32)
A través del método anterior se puede obtener sólo el valor de la contraseña correspondiente, que es de lejos el más difícil de descifrar.
Mira, si has tenido una sensación de crisis, entonces la acción:
-
Si usted es un usuario regular, entonces le recomendamos LastPass para el almacenamiento de la contraseña y la generación, en diferentes sitios utilizan diferentes contraseñas.
-
Si usted es un desarrollador, entonces le recomendamos insistentemente que utilice el programa de expertos para el almacenamiento de contraseñas.
- Directory
- Previous section: SQL injection
- Next section: Encrypt and decrypt data