Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Informix Новый топик    Ответить
 Как вычислить md5 через SPL  [new]
victor16
Member

Откуда:
Сообщений: 591
Ниже как создать SPL процедуру, возвращающую хэш по алгоритму md5.
Способ предназначен для Linux с использованием OpenSSL.

get_md5.c

#include <stdio.h> 
#include <string.h> 
#include <openssl/md5.h> 
#include <mi.h>
#include <milib.h>

#ifdef _WIN32
#define DllExport __declspec(dllexport)
#else
#define DllExport
#endif

DllExport
mi_lvarchar *
get_md5(mi_lvarchar *_strIn)
{ 
  MD5_CTX context; 
  int i; 
  unsigned char digest[16];
  char *strIn = mi_lvarchar_to_string(_strIn);
  unsigned int len = strlen(strIn);
  mi_lvarchar *md5sum;
  char *strOut;

  MD5_Init(&context); 
  MD5_Update (&context, strIn, len); 
  MD5_Final(digest, &context); 

  strOut= mi_zalloc(strlen(digest));

  for (i = 0; i < 16; i++) {
    char currS[3];
    sprintf(currS, "%02x", digest[i]); 
    strOut = strcat(strOut, currS);
  }

  md5sum = mi_string_to_lvarchar(strOut);
  return (md5sum);
}

build.sh

cc -fpic \
    -I${INFORMIXDIR}/incl/public \
    -lcrypto \
    -c get_md5.c

ld -dy -G -Bsymbolic -o get_md5.so get_md5.o

get_md5.sql

drop function if exists get_md5_c;
create function get_md5_c(lvarchar) returns lvarchar
     external name '/<YOUR_SOURCE_PATH>/get_md5.so(get_md5)' 
	language c;

test output

+ dbaccess -e mydb build_md5.sql

Database selected.

drop function if exists get_md5_c;
Routine dropped.


create function get_md5_c(lvarchar) returns lvarchar
external name '/opt/distr/testMD5/udr/get_md5.so(get_md5)'
language c;
Routine created.

;

Database closed.

+ dbaccess -e mydb test_md5.sql

Database selected.

execute function get_md5_c("password")



(expression) 5f4dcc3b5aa765d61d8327deb882cf99

1 row(s) retrieved.


Database closed.



С уважением
Виктор
1 ноя 10, 13:57    [9711596]     Ответить | Цитировать Сообщить модератору
 Re: Как вычислить md5 через SPL  [new]
Журавлев Денис
Member

Откуда: St.John,NB,CA
Сообщений: 5532
я бы использовал java udr, платформонезависимо.
1 ноя 10, 17:33    [9713788]     Ответить | Цитировать Сообщить модератору
 Re: Как вычислить md5 через SPL  [new]
victor16
Member

Откуда:
Сообщений: 591
да, похоже, c-шников среди информиксоидов не осталось :)
в предыдущем примере были небольшие неточности, приводящие к утечке памяти.
get_md5.c
#include <stdio.h> 
#include <string.h> 
#include <openssl/md5.h> 
#include <mi.h>
#include <milib.h>

#ifdef _WIN32
#define DllExport __declspec(dllexport)
#else
#define DllExport
#endif

DllExport
mi_lvarchar *
get_md5(mi_lvarchar *_strIn)
{ 
  MD5_CTX context; 
  int i; 
  unsigned char digest[16];
  char *strIn = mi_lvarchar_to_string(_strIn);
  unsigned int len = strlen (strIn);
  mi_lvarchar *md5sum;
  unsigned char strOut[33];

  MD5_Init(&context); 
  MD5_Update (&context, strIn, len); 
  MD5_Final(digest, &context); 

  for (i = 0; i < 16; i++) {
    char currS[3];
    sprintf(currS, "%02x", digest[i]); 
    strOut[2*i] = currS[0];
    strOut[2*i+1] = currS[1];
  }
  strOut[33] = 0;

  md5sum = mi_string_to_lvarchar(strOut);
  mi_free(strIn);
  return (md5sum);
}
5 мар 11, 17:22    [10331344]     Ответить | Цитировать Сообщить модератору
Все форумы / Informix Ответить