Password Tools

How to embedded a password in a source code without revealing it?

Introducing the problem

Even in delivering software in a binary form a tool like strings or hexdump would reveal buffer content when they are statically initialized. However the problem was solved a long time ago as /etc/shadow demonstrates and here again would be solved just with different code but with the same theoretical approach: some functions are easy to go but very hard to get reversed back.

Introducing a solution

Create a random salt and a hash code based on the original password

function passwd_create() {
  salt=$RANDOM$RANDOM; echo -n passwd:; read passwd;
  declare -i n=$(echo -n $passwd | wc -c)
  if test $n -ge 8; then
    echo $salt:$(echo "$salt$passwd" | md5sum - | cut -d\  -f1)
  fi
}

EXAMPLE:

ciaobello
221347629:3c9163999549cc44773b7028c05b1781

How to verify the input password:

function passwd_check() {
  hash="221347629:3c9163999549cc44773b7028c05b1781"
  s=$(echo $hash | cut -d\: -f1)
  echo -n passwd:;read p

  if [ "$s:$(echo "$s$p" | md5sum - | cut -d\  -f1)" == "$hash" ]; then
    echo OK-LOGIN-ACCPETED; else echo PASSWD IS WRONG;
  fi
}

The challenge is to find a acceptable password which fits with this salt:hash like this:

221347629:3c9163999549cc44773b7028c05b1781

saved in this form is quite easy to recognize salt before character ':' and hash code after. That does not hurt because usually the code is clear if source code is delivered. The salt increase the attacker effort in breaking the hash by dictionary attack. To strength the privacy of the information ciphered in the hash is to save this hash in a very bigger buffer of random data (stenographic) and implement a reading algorithm writing it a very unnecessary long and obfuscated way. In this way the attacker in order to retrieve the hash and salt has to deeply understand a lot of obfuscated code. Obfuscated code usually is not welcome in open source community. However use a simple way to hidden the salt and hash codes are useful to in order to avoid these codes be revealed by the usage of very common tools like strings.

Using SHA1 checksum in C language

An example of using SHA1 checksum in C language project to generate random password and verify it against their hash with a random salt.

foglietr@rafbox:~$ ./passwdtools

COMMAND HELP:
rpg [n] : random password generation where n is lenght in chars
shg <p> : salt and hash generation from a given password
ckp <s:h>: check input password against given salt and hash

Download the source from here passwdtools.c and compile with:

gcc -o passwdtools -O3 -Wall passwdtools.c
strip passwdtools
size passwdtools
   text    data     bss     dec     hex filename
  14725     340     352   15417    3c39 passwdtools

Random password generator in a nutshell

Cosa serve per creare un generatore di password causali?

  • un generatore di numeri pseudocasuali
  • un'ampia piscina di dati casuali
  • uno script e un minimo di dimestichezza

Andiamo a vedere nel dettaglio ognuno dei tre punti:

  • è certo che debba esservi una componente casuale altrimenti un qualsiasi procedura di generazione sarebbe in qualche modo prevedibili. Si potrebbe supporre che più complessa è la procedura di generazione più è difficile da prevedere. Questa supposizione è falsa, questa falsità è difficile da dimostrare perchè sembra contraria al buon senso ma purtroppo non è così: fenomeni complessi possono generare output prevedibili. Inoltre la complessità del software aumenta il suo costo, la sua manutenzione, gli errori e infine la sua sicurezza in termini generali.
  • non esistono generatori di numeri perfettamente casuali negli attuali computer quindi per aggiungere un livello ulteriore di causalità si pesca un numero quasi casuale e poi si prende un simbolo da una piscina (un insieme casuale di simboli). In teoria si dovrebbe generare una sequenza pseudocasuale di simboli ammissibili e poi ogni volta che serve una password generarla estraendo a sorte da questa sequenza, poi buttare via la sequenza. Nel nostro caso non serve a molto questo passaggio quindi la piscina viene usata per convertire un numero pseudocasuale in un simbolo ammissibile e per fare questo basterebbe la divina commedia purgata dai simboli non ammissibile (anche se la frequenza delle lettere nel linguaggio non è casuale e non uniforme e quindi diminuisce l'entropia della password rispetto alla fonte pseudocasuale ma ampliando l'alfabeto dei simboli da 0-9, cioè 10, a 0-9 a-z A-Z, cioè 62, permette di aumentare l'entropia della password rispetto all'uso della rappresentazione decimale del numero pseudocasuale in se.
  • serve uno script perchè farlo a mano è una rottura e usare il linguaggio C è più oneroso:
#!/bin/bash 
declare -i n m lunghezza=$1
test $lunghezza -lt 6 && lunghezza=6
alfabeto="0123456789abcdefghijklmnopqrstvwxyzABCDEFGHIJKLMOPQRSTUVWXYZ"
let n=$(echo -n "$alfabeto" | wc -c)
for i in $(seq 1 $lunghezza); do
    let m=$RANDOM%$n+1
    echo -n "$alfabeto" | head -c$m | tail -c1
done
echo
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-Share Alike 2.5 License.