No, pěkně se to zamotalo, protože se tu řeší tři zcela nesouvisející věci:

1) Proč dotaz do MySQL použije UTF-8 a nikoliv latin1 jak je v databázi.
  To asi bude lepší dál nerozebírat.

2) Proč SpringSecurity (zřejmě) používá při generování hashí hesel
kódování UTF-8
 Přiznám se že netuším a ani to nechci zkoumat, protože mi to připadá
jako zcela správné a logické.

3) Vaše metoda nedokáže pracovat s UTF-8 nebo UTF-16
 Konkrétně, na této řádce je špatně počet byte:
    messageDigest.update(_sPassword.getBytes(_sEncoding), 0,
_sPassword.length());
 Metoda String.length vrací počet znaků, zatímco třetí parametr
MessageDigest.update je počet byte. Tyto dvě hodnoty se shodují pro
latinX, ale pro UTF bývá počet byte větší.
 Oprava:
   messageDigest.update(_sPassword.getBytes(_sEncoding));

 Dále ještě vidím druhou chybu, menší ale o to záludnější: opravdu
stačí doplňovat jen jedinou nulu na začátek? Co když bude celý první
byte nulový?

Kamil Podlešák


2010/10/15 Radovana Straube <[email protected]>:
> System.out.println(MD5Crypter.encode("§", "ISO-8859-1"));
> System.out.println(MD5Crypter.encode("§", "UTF-8"));
> System.out.println(MD5Crypter.encode("§", "UTF-16"));
>
> 6b2b98fea11e51af3043b192f719bd69
> 6465dad1d31752be3f3283e8f70feef7
> 403ae091d3be6acf1181148527f1e0ae
>
> Radovana Straube
>
>
>
>
>

Odpovedet emailem