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;
}
Related posts:
ukazka kodu v C je sprasena, kvoli znakom < a >. konkretne nevidno nazvy inkludnutych kniznic a druhu polovicu fcie myCrypt a prvu polovicu fcie main
Dík za upozornění, snad jsem to opravil do správné podoby…