Generování hesel ve formátu md5 crypt

Pravděpodobně nejčastěji potřebuji generovat heslo v md5 crypt formátu, taktže zde uvedu pár postupů jak na to.

Krátký textík o formátu hesel používaných v UNIXových systémech: http://www.zdenda.com/hesla-v-solarisu-a-linuxu

mkpasswd

Program mkpasswd (používám verzi z Debianu) je možné použít pro generování například MD5 hashů hesel. Jenže né vždy je vhodné/možné použít tento program (například na webu v PHP a podobně je nevhodné spouštět externí programy), proto jsem tu sezbíral různé možnosti jak generovat hashe hesel.

Příklad jak volat mkpassw:

mkpasswd --hash=md5 -S blahblah  foobar

blahblah je takzvaný SALT, foobar je naše heslo. Salt samozřejmě nemusíte zadávat. Nedoporučuji spouštět mkpasswd takto z příkazového řádku, protože heslo vám zustane zapsané v historii shellu a během spouštění mkpasswd ho každý může vidět ve výpisu procesů (pokud nezadáte heslo jako parametr, mkpasswd vás k jeho zadání vyzve po spuštění).

Pozor na Slackware, je v něm jiný program mkpasswd než v Debianu.

OpenSSL

Pokud v systému nenajdete program mkpasswd, můžete zkusit openssl.

openssl passwd -1 heslo

Heslo samozřejmě nemusíte zadávat jako parametr, ale můžete počkat až vás o něj openssl požádá po spuštění.

PHP

Funkce md5(text) počítá hash a používá se pro kontrolu integrity dat, nehodí se pro uložení hesla kvůli slovníkovému útoku.

Pro heslo se používá funkce crypt(heslo,salt), kde salt je pro md5-hesla „$1$ABCDEFGH$“ kde ABCDEFGH je nahodnych osm znaků (velká,malá,čísla). V PHP pokud je salt prázdný řetězec, salt se vygeneruje (neplati pro staré verze).

crypt("foobar",'$1$blahblah$')

C

cc -o program program.c -lcrypt

#include <stdio.h>
#include <crypt.h>
#include <stdlib.h>
#include <time.h>

#define SALTLEN 8

static char chset[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

char *myCrypt(char *pwd) {
  int i;
  char salt[SALTLEN+5]="$1$";

  srand(time(NULL));
  for(i=0;i<SALTLEN;i++)
    salt[i+3]=chset[rand() % strlen(chset)];
  salt[i+3]='$';
  salt[i+4]='\0';

  return crypt(pwd,salt);
}

int main(int argc, char *argv[]) {
  if (argc<2)
    fprintf(stderr,"Use: %s password\n",argv[0]);
  else
    printf("%s\n",myCrypt(argv[1]));
  return 0;
}

Napsat komentář