Kebmans blogg

Hvordan kryptere passord i PostgreSQL

Posted in Data, Programmering, Teknologi by kebman on 26/08/2015

PostgreSQL kan med et enkelt håndgrep gjøre passordkryptering for deg. Alt du trenger å gjøre er å legge til en extension i psql, sånn her:

CREATE EXTENSION pgcrypto;

Så er det bare å lage en database for å teste litt:

CREATE DATABASE test;

Og en tabell for å lagre noen data med passord:

CREATE TABLE testusers (
	id SERIAL PRIMARY KEY,
	email TEXT NOT NULL,
	password TEXT NOT NULL,
);

SERIAL er her ekvivalenten til AUTO_INCREMENT i MySQL. Strengt tatt kunne vi sikkert brukt email-feltet som PRIMARY KEY, sånn som her:

CREATE TABLE testusers (
	email TEXT PRIMARY KEY,
	password TEXT NOT NULL,
);

…men jeg synes det er kjekt å kunne kalle opp en god, gammeldags ID, spesielt om det senere kan bli snakk om å utføre SQL joins. Istedenfor kan man gjøre sånn her for å sikre at email-feltet forblir unikt:

ALTER TABLE users ADD CONSTRAINT unique_email UNIQUE (email);

Men så, endelig, kan vi teste med å sette inn noe ordentlig data! For å lage skikkelig gode passord, er det ikke nok med bare en god krypteringsalgoritme. Man trenger også salt. Dette for å hindre såkalte rainbow angrep. Her er årsaken til at vi la til den extensionen i sta, for med den kan vi legge til skikkelig godt salt, sånn her:

INSERT INTO testusers(email, password) VALUES (
	'test@test.com', crypt('det_hemmelige_passordet', gen_salt('md5'))
);

Som du ser så hashes passordet med det samme det legges inn i databasen med en funksjon som heter crypt(). Denne tar to argumenter: Passordet og funksjonen gen_salt() som lager salt. For å sjekke at passordet stemmer, kan man bruke denne spørringen:

SELECT email FROM testusers WHERE id=1 AND
password=crypt('det_hemmelige_passordet', password);

Så, når dette er gjort, burde det være en smal sak å få det til å fungere med et passende serverskriptingspråk. Best av alt, skulle noen uvedkomne få tilgang til databasen, vil de uansett ikke kunne finne ut hva passordene er – ikke lett, i alle fall.

Hvordan gjøre ordsøk i MySQL

Posted in Programmering, Programvare, Scripting, Teknologi by kebman on 25/02/2012

Så du trenger å søke etter ord i databasen din? Her er noen kjappe eksempler på hvordan du kan gjøre det.

Fulltext-søking er kanskje den greieste måten å søke etter ord i SQL-databaser. Det er veldig kjapt og fungerer bra så lenge ordet er lenger enn tre bokstaver. Grunnen til dette er at det krever ekstra kapasitet å indeksere kortere ord, spesielt om de opptrer ofte. Slik bruker du fulltext-søk:

SELECT * FROM tabell
WHERE MATCH(felt)
AGAINST('søkeord' IN BOOLEAN MODE);

Men hva om du ønsker å søke etter ord med færre enn fire bokstaver? Vel, her er noen alternativer.

Ved å bruke LIKE kan du søke etter felter som inneholder ditt søkeord, enten det er del av større ord eller ikke. Du får som regel ganske mange treff med denne, og det er ikke like kjapt som Fulltext-søk.

SELECT * FROM tabell
WHERE felt
LIKE '%søkeord%';

Eksperimenter med å fjerne prosenttegn foran eller bak. Prosenttegnet fungerer som et «wildcard» eller en joker, og betyr «hvilken som helst tegn».

Men kanskje du bare vil ha hele ord som står alene? Prøv i så fall regular expressions.

SELECT * FROM tabell
WHERE felt
REGEXP '[[:<:]]søkeord[[:>:]]';

Merk at denne vil også gi treff på ord som har bindestrek foran eller bak. En annen hake er at regular expressions kan være litt tregt fordi det krever en del ekstra prosesseringskraft. Det er ikke alltid det er så viktig, men skal du lage noe som er stort og blir hyppig brukt av svært mange brukere, risikerer du fort at forsinkelsene blir merkbare.

Vil du kun ha helt enslige ord, må du søke etter ord som har mellomrom foran og bak. Prøv i så fall denne:

SELECT * FROM tabell
WHERE Locate('søkeord ', felt) > 0
AND Locate(' søkeord', felt) > 0;

Legende:

  • tabell: Databasetabellen du ønsker å søke i
  • felt: Feltet i tabellen som du ønsker å søke i
  • søkeord: Søkeordet du ønsker å bruke