Я пишу класс для хеширования паролей, который реализует 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": []}
Я что-то делаю неправильно? Как я могу это исправить?