2013-08-01 3 views
1

У меня есть приложение, которое мне нужно слить пароли. Чтобы сгенерировать соли, я решил использовать SecureRandom. Все работает отлично, когда я нахожусь на своей машине для окон. Затем я попытался запустить свой код на машине на базе Linux (Centos 5), и все сломалось.SecureRandom генерирует значения различной длины

Я изолировал проблему и создал этот тестовый случай:

public static void main(String[] args) { 
    SecureRandom sr = new SecureRandom(); 
    byte[] saltBytes = new byte[256]; 
    sr.nextBytes(saltBytes); 
    String salt = new String(saltBytes); 
    System.out.println(salt.length()); 
} 

В окнах выхода всегда 256, но на моей машине Linux изменение выходного сигнала и никогда не 256. Это, кажется, всегда генерировать соль, меньше, чем 256.

Кто-нибудь знает, почему это происходит?

Решение:

Я только что изменил новую строковую строку new String(saltbytes, "ASCII");

+1

Вы не устанавливаете кодировку String, используйте 'String (byte [] bytes, Charset charset)' constructor. –

+0

Вы не должны пытаться помещать двоичные данные в текстовую строку. Это обычно приводит к путанице. –

ответ

5

выпуска является кодировкой символов. В linux, который обычно является utf-8, который является кодировкой переменной длины. Если вы хотите строку, используйте вместо нее base64.

+0

В то же время :) –

Смежные вопросы