2

#PlatziCodingChallenge - Fuerza bruta en contraseñas

¿Son realmente seguras las contraseñas que generaste? Puedes ponerlas a prueba mediante la fuerza bruta, la cual consiste en tratar de adivinarlas con intentos uno tras otro. Así que deberás escribir un programa que reciba una contraseña y comience a generar cadenas de texto en forma aleatoria hasta hacerla coincidir con tu contraseña. Muestra en la salida cuantos intentos y tiempo le tomó llegar a la misma.

Escribe tu comentario
+ 2
Ordenar por:
1

En Python 😃 En este caso la selección de las contraseñas se hace letra por letra y todo es randomico hasta encontrar una coincidencia, en contraseñas pueden ser contraseñas de 1 a 8 caracteres.

importrandom
contraseña=input('INGRESA TU OPCIÓN DE CONTRASEÑA: ')
minusculas=['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
mayusculas=['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
numeros=['1','2','4','5','6','7','8','9','0']
diccionario=[' ','|','°','¬','!','"','#','$','%','&','/','(',')','=','?','*','¿','¡','"','+','~','{','}','[',']',';',',',':','.','-','_','>','<']
tipo=['minusculas','mayusculas','numero','diccionario']
cont=0
adivinado=[]
while contraseña!=adivinado:
    adivinado=[]
    cont=cont+1
    caracter=random.randint(1,8)
    #caracter=8for i in range(caracter):
        tip='minusculas'
        tip=random.choice(tipo)
        if tip=='minusculas':
            letra=random.choice(minusculas)
        elif tip=='mayusculas':
            letra=random.choice(mayusculas)
        elif tip=='numero':
            letra=random.choice(numeros)
        elif tip=='diccionario':
            letra=random.choice(diccionario)
        else:
            pass
        adivinado.append(letra)
    adivinado=''.join(adivinado)
    print(adivinado)
print(f'Tu contraseña {adivinado} se adivinó en {cont} intentos')
1
7689Puntos

Hice 2 versiones, la primera que me averigüe uno por uno cada caracter, ahí los intentos no eran tantos:

<!DOCTYPE html><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width, initial-scale=1.0"><title>Validador de contraseñas</title></head><style>
  * {
    margin: 0;
  }

  .contenedor {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    height: 100vh;
  }

  .inputs {
    display: flex;
    flex-flow: column;
    align-items: center;
    padding: 2rem;
  }

  .section {
    padding: 0.25rem2rem;
    display: flex;
    align-items: center;
  }

  .sectioninput, .sectionspan{
    margin-left: 12px;
    font-weight: bold;
  }


  .btn {
    border: 2px solid black;
    border-radius: 6px;
    cursor: pointer;
    padding: 20px;
  }

</style><body><divclass="contenedor"><h1style="margin-bottom: 24px;">Validador de contraseñas</h1><divclass="inputs"><sectionclass="section">
        Ingresa la contraseña que deseas realizar fuerza bruta: <inputid="contra"type="password"placeholder="contraseña"/></section><sectionclass="section"><spanstyle="margin-right: 10px;"id='resultado'></span></section></div><buttononclick="validar()"class="btn">Validar...</button></div><script>functionvalidar(){
      const contra = document.getElementById('contra').value.split('')
      const contraCreada = []
      
      const datos = {
        num: [48,49,50,51,52,53,54,55,56,57],
        min: [97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122],
        mayus: [65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90],
        esp: [32,33,34,35,36,37,39,40,41,42,43,44,45,46,47,58,59,60,61,62,63,64,91,92,93,94,95,96,123,124,125,126]
      }

      let rango = []

      rango.push(datos.min)
      rango.push(datos.mayus)
      rango.push(datos.num)
      rango.push(datos.esp)
      rango = rango.flat(1)

      let index = 0let intentos = 0while (contra.length != contraCreada.length){
        let variable = Math.floor(Math.random()*(rango.length))
        let char = String.fromCharCode(rango[variable])
        if (contra[index] == char){
          contraCreada.push(char)
          index++
        }
        intentos++
      }

      console.log(contraCreada, intentos)
    }
  </script></body></html>
1
7689Puntos
6 meses

De ahí hice el segundo que es justamente como lo piden, lo hice con nodemon para ver solamente la consola ya que en el navegador se me congelaba, pero es bastante azar… el código es el siguiente:

functionvalidar(){
  const contra = 'hola'let contraCreada = []
  
  const datos = {
    num: [48,49,50,51,52,53,54,55,56,57],
    min: [97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122],
    mayus: [65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90],
    esp: [32,33,34,35,36,37,39,40,41,42,43,44,45,46,47,58,59,60,61,62,63,64,91,92,93,94,95,96,123,124,125,126]
  }

  let rango = []

  rango.push(datos.min)
  rango.push(datos.mayus)
  rango.push(datos.num)
  rango.push(datos.esp)
  rango = rango.flat(1)

  let intentos = 0console.time('Tiempo')
  while (contra != contraCreada.join('')){
    contraCreada = []
    for (let i = 0; i < contra.length; i++){
      let variable = Math.floor(Math.random()*(rango.length))
      let char = String.fromCharCode(rango[variable])
      contraCreada.push(char)
    }
    intentos++
  }
  console.timeEnd('Tiempo')
  console.log(contraCreada, intentos)
}

validar()

Por ejemplo poniendo la contraseña como ‘hola’ tuve estos 3 diferentes resultados:

Con una clave ‘axRF35(/’ que tiene todas las condiciones no pudo resolverlo, se quedo horas corriendo y como no me lanzaba el resultado lo paré. Se realizaron un total de 1796383641 intentos

1
19943Puntos

Fuerza Bruta en contraseñas en JavaScript

// Fuerza bruta en contraseñas en JavaScriptfunctioncontrasPosibles(lenght) {
  let passwordsOneChar = Array.from({ length: 126 - 32 + 1 }, (v, i) => i + 32).map(n => String.fromCharCode(n))
  if (lenght === 1) {
    return passwordsOneChar
  } else {
    return passwordsOneChar.flatMap(char => contrasPosibles(lenght - 1).map(pass => `${pass}${char}`))
  }
}

functionpasswordGuesser(password, maxAttempts = 1000) {
  let passwordLength = password.length // Obtiene el largo de la contraseña// Obteniendo todas las contraseñas posibleslet possiblePasswords = contrasPosibles(passwordLength)
  // Buscando la contraseña entre las posibleslet generatedPassword
  let attempts = 0let start = newDate().getTime()
  do {
    let randomIndex = Math.floor(Math.random() * possiblePasswords.length)
    generatedPassword = possiblePasswords.splice(randomIndex, 1)
    generatedPassword = generatedPassword[0]
    attempts++
    // debugger
  } while (generatedPassword !== password && attempts < maxAttempts);
  let end = newDate().getTime()
  let time = end - start
  let guessed = generatedPassword === password
  return { password, attempts, time, guessed }
}

console.log(passwordGuesser('a'))
// {password: "a", attempts: 26, time: 0, guessed: true}console.log(passwordGuesser('f0?'))
// {password: "f0?", attempts: 15381, time: 17, guessed: true}// console.log(passwordGuesser('Amo Platzi')) ... Muchas letras