On Wed, Apr 05, 2000 at 12:04:49PM -0500, Victor Manuel Jaquez Leal wrote: > > Hi! Hi back at ya. > > I know that with \df you can see the functions available in postgres, but > there must be others not documented just like getpgusername(). > > My question is if are there a more complete list of postgres' > functions. To be more specific I'm looking for a crypt function. > Then you're in luck. Not as much luck as if there was a built in, but I've attached my implementation below. I stole a general boiler plate function from someone else, and modified it to call crypt. The trickiest part was generating random salt. I use it with these SQL statements: CREATE FUNCTION "sqlcrypt" (text,text ) RETURNS text AS '/usr/local/pgsql/data/sqlcrypt.so' LANGUAGE 'C'; CREATE FUNCTION "sqlcrypt" (text ) RETURNS text AS 'select sqlcrypt($1,'''')' LANGUAGE 'SQL'; That way, I can say sqlcrypt('somestring') and it'll return a crypted version of the string, with a randomly selected salt. I use it for storing passwords for a web based login: for that, we check logins as so: SELECT * FROM "Personnel" WHERE "PerUsername" = 'RJReedstrom' AND "PerPassword" = sqlcrypt('password',substr("PerPassword",1,2)) That will only return results if the password hashes match. It does expose the cleartext of the password between the web server and postgres db: That's not a problem for us, since they're on the same machine. Ross -- Ross J. Reedstrom, Ph.D., <[EMAIL PROTECTED]> NSBRI Research Scientist/Programmer Computer and Information Technology Institute Rice University, 6100 S. Main St., Houston, TX 77005
#define _XOPEN_SOURCE #include <postgres.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #include <sys/time.h> text *sqlcrypt(text *key, text *salt); /*sql create function sqlcrypt(text,text) returns text as 'DESTLIB' language 'c'*/ char *crypt(const char *key, const char *salt); int rand(void); void srand(unsigned int seed); text *sqlcrypt(text *key, text *salt) { text *ret; char pass[] = "123456789"; char s[] = "..."; char salts[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789./"; int j,k; struct timeval tv; s[2]=0; bzero(pass,9); if ((VARSIZE(salt)-VARHDRSZ) < 2) { gettimeofday(&tv,0); srand((unsigned int)(tv.tv_usec)); j=(rand() % 64); k=(rand() % 64); s[0]=salts[j]; s[1]=salts[k]; } else { memcpy(s,VARDATA(salt),2); } ret = palloc(VARHDRSZ + 13); bzero(ret,VARHDRSZ + 13); VARSIZE(ret) = (VARHDRSZ + 13); if ((VARSIZE(key)-VARHDRSZ) < 8) { memcpy(pass,VARDATA(key),VARSIZE(key)-VARHDRSZ); } else { memcpy(pass,VARDATA(key),8) ; } memcpy(VARDATA(ret), crypt(pass,s),13); return ret; }