Função de Base64 Encode para o MySQL sem tabela de conversão
Author: Ricardo Soares - Postado em: 30/12/2015
Relacionado as categorias: Segurança, Tecnologia | Leave a Comment
Abaixo o código disponível também no Stack Overflow que é o melhor que identifiquei até o momento. No passado eu havia salvo um link para o código original, mas ele saiu do ar. Para prevenir que o mesmo ocorra com o link atual e facilitar minha busca estou colocando o script diretamente neste blog.
DELIMITER $$ USE `YOUR DATABASE`$$ DROP FUNCTION IF EXISTS `BASE64_ENCODE`$$ CREATE DEFINER=`YOUR DATABASE`@`%` FUNCTION `BASE64_ENCODE`(input BLOB) RETURNS BLOB DETERMINISTIC SQL SECURITY INVOKER BEGIN DECLARE ret BLOB DEFAULT ''; DECLARE done TINYINT DEFAULT 0; IF input IS NULL THEN RETURN NULL; END IF; each_block: WHILE NOT done DO BEGIN DECLARE accum_value BIGINT UNSIGNED DEFAULT 0; DECLARE in_count TINYINT DEFAULT 0; DECLARE out_count TINYINT; each_input_char: WHILE in_count < 3 DO BEGIN DECLARE first_char BLOB(1); IF LENGTH(input) = 0 THEN SET done = 1; SET accum_value = accum_value << (8 * (3 - in_count)); LEAVE each_input_char; END IF; SET first_char = SUBSTRING(input,1,1); SET input = SUBSTRING(input,2); SET accum_value = (accum_value << 8) + ASCII(first_char); SET in_count = in_count + 1; END; END WHILE; -- We've now accumulated 24 bits; deaccumulate into base64 characters -- We have to work from the left, so use the third byte position and shift left CASE WHEN in_count = 3 THEN SET out_count = 4; WHEN in_count = 2 THEN SET out_count = 3; WHEN in_count = 1 THEN SET out_count = 2; ELSE RETURN ret; END CASE; WHILE out_count > 0 DO BEGIN BEGIN DECLARE out_char CHAR(1); DECLARE base64_getval CURSOR FOR SELECT c FROM core_base64_data WHERE val = (accum_value >> 18); OPEN base64_getval; FETCH base64_getval INTO out_char; CLOSE base64_getval; SET ret = CONCAT(ret,out_char); SET out_count = out_count - 1; SET accum_value = accum_value << 6 & 0xffffff; END; END; END WHILE; CASE WHEN in_count = 2 THEN SET ret = CONCAT(ret,'='); WHEN in_count = 1 THEN SET ret = CONCAT(ret,'=='); ELSE BEGIN END; END CASE; END; END WHILE; RETURN ret; END$$ DELIMITER ;
Comments
Leave a Reply