Усиление ключа. Правильно ли я делаю?

Я пишу класс для хеширования паролей, который реализует Key Stretching с помощью класса System.Security.Cryptography.Rfc2898DeriveBytes для генерации ключей, используемых для вычисления хеш-значения.

Код, по сути, делает следующее:

// Higher iterations value results in better key strength
var db = new Rfc2898DeriveBytes(password + salt + secretKeyFromConfigFile,
                                saltAsBytes,
                                iterations);

byte[] hashKey = db.GetBytes(64); // 64 bytes is the recommended size for the HMACSHA512 class

var sha512 = new System.Security.Cryptography.HMACSHA512(hashKey);

byte[] hashInput = System.Text.Encoding.UTF8.GetBytes(password + salt + secretKeyFromConfigFile);

byte[] hash = sha512.ComputeHash(hashInput);

return System.Convert.ToBase64String(hash);

Документация для System.Security.Cryptography.Rfc2898DeriveBytes указывает, что он использует «... генератор псевдослучайных чисел на основе System.Security.Cryptography.HMACSHA1» для получения ключа. Я думал, это будет банально. Моя первая попытка была написать что-то вроде этого @GET @Produces ({MediaType.APPLICATION_JSON, MediaType ....

Я пытаюсь вернуть список строк в Джерси как JSON и XML. Я подумал, что это будет тривиально.

Моей первой попыткой было написать что-то вроде этого

@GET
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
@Path("/bar")
public List get() {
    return dao.get();
}

, и я ожидал, что результат будет похож на этот: ["string1", ..., "stringN] к сожалению, я получил следующее:

com.sun.jersey.api.MessageException: A message body writer for Java class java.util.LinkedList, and Java type java.util.List, and MIME media type application/json was not found 

Затем я написал оболочку StringList для списка

@XmlRootElement
public class StringList {

    private List data;

    public StringList() {
    }

    public StringList(List data) {
        this.data = data;
    }

    public List getData() {
        return data;
    }

    public void setData(List data) {
        this.data = data;
    }
}

и изменил фасад на

@GET
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
@Path("/foo")
public StringList stringlist() {
    return new StringList(sl());
}

, который отлично подходит для списков с большим количеством элементов, чем 1.

{"data":["foo","bar"]}

К сожалению, я получаю два непредвиденных результата для одного или нулевые элементы

{"data": "just one"} // for one element i would expect {"data": ["just one"]}

null // for no elements i would expect {"data": []}

Я что-то делаю неправильно? Как я могу это исправить?

17
задан Fábio 24 August 2017 в 14:07
поделиться