Criptografia

Pessoal meu algoritmo de cripto está com o seguinte código:

MessageDigest md = MessageDigest.getInstance(“SHA”);
md.update(sequencia.getBytes());
byte[] msgGerada = md.digest();
sMsg = new String(msgGerada);

Porém não estou conseguindo inserir esse valor no meu banco de dados Interbase pq ele diz que pode ser overflow, string sendo truncada ou q não consegue traduzir o valor de algum campo.Das alternativas a unica possivel é a última. Eu acho q é pq ele tá gerando caracteres unicode e o banco n suporta mas é só um palpite e mesmo q seja alguem tem uma dica???

Qualquer ajuda é bem vinda :smiley:

Aí tá o erro do banco:( o campo password já foi aumentado pra 255)

Arithmetic exception, numeric overflow, or string truncation
Cannot transliterate character between character sets
Statement: insert into ag_user(user_code,user_id,user_password,user_email)values (4,‘cainsAS’,‘ñ(!»¾¥’‘ê R1ÀYDQ?’,‘asdasd.com.as’)

colunas da tabela:

USER_CODE INTEGER NOT NULL,
USER_ID VARCHAR(255) CHARACTER SET ISO8859_1,
USER_PASSWORD VARCHAR(255) CHARACTER SET ISO8859_1,
USER_EMAIL VARCHAR(255) CHARACTER SET ISO8859_1,

Eu tentaria converter antes praquele formato com os valores em hexadecimal concatenados(a maneira que é mais usual…)

Aqui nesse site tem como fazer, só que usando o MD5… basta você mudar isso… aí é certeza que você consegue jogar dentro do seu banco…

http://www.koders.com/java/fid5AA30D438BAC5164A4AA7D132CC244764D775FD3.aspx

Repita comigo: strings em Java não são arrays de bytes. Repita mais uma vez: strings em java são arrays de caracteres.

Em Java não é possível guardar diretamente um array de bytes em uma String sem danificar o array de bytes, a menos que esse array tenha sido obtido a partir de uma outra String com “getBytes()”.
O que você deve fazer é converter o array de bytes para Base-64 ou hexadecimal (se quiser guardar como uma string), ou então guardar diretamente os bytes no banco (nem sempre é recomendável porque costuma ser muito trabalhoso, e o tratamento é diferente de banco para banco.).
Como o seu array é pequeno (tem exatamente 20 bytes), recomendo usar hexadecimal (vai dar um campo de 40 caracteres, que não é muito grande). Se você usasse Base-64 não ia economizar muito (ia dar 28 caracteres), não sei se faz diferença para você.
Aqui lhe dou uma função para “quebrar o seu galho”.
Para ver se o SHA-1 da senha que o usuário cadastrou bateu com o SHA-1 da senha que o usuário passou, é só converter ambos os SHA-1 para uma string hexadecimal, e bater as strings.

	/** 0-9, a-f */
	private static final char[] HEX = "0123456789abcdef".toCharArray();
	/**
	 * Converte um array de bytes em uma string hexadecimal.
	 * @param bytes Os bytes a serem convertidos.
	 * @return Uma string em hexadecimal
	 */
	public static String toHex(byte[] bytes) {
		char[] ret = new char[bytes.length * 2];
		for (int i = 0, j = 0; i < bytes.length; ++i) {
			ret[j++] = HEX[(bytes[i] >> 4) & 0x0F];
			ret[j++] = HEX[bytes[i] & 0x0F];
		}
		return String.valueOf(ret);
	}

Valeu pessoal, o exemplo foi de grande ajuda e deu pra fazer usando o SHA mesmo era so passar pra hexadecimal os bytes gerados e sim estou pegando os bytes de uma string através do getBytes() sem bronca quanto a isso ! :slight_smile:

Valeu!