1.10.Формирование SOAP-заголовка Для отправки запросов в подсистему «Электронный полис» должны быть безошибочно заполнены соответствующие элементы заголовка SOAP-сообщения (тег ). В заголовке обязательно указывается логин и пароль СК. Логины и пароли определяются РСА для каждой страховой компании.
SOAP-заголовок состоит из элемента , предназначенного для передачи информации, относящейся к обеспечению безопасности SOAP-сообщения. Элемент состоит из подэлемента , который в свою очередь содержит вложенные элементы и .
В элементе передается логин пользования, а в элементе – пароль, зашифрованный по формуле Base64 с помощью алгоритма SHA1 (Nonce + Created + Password) (тип пароля PasswordDigest). Элемент содержит случайное число, которое генерируется при каждом отправлении запроса в подсистему «Электронный полис», преобразованное в массив байт и закодированное с помощью base64, а элемент – дату отправления запроса в формате UTC.
Таким образом, окончательный пароль в PasswordDigest формируется из следующих элементов:
password, выданный СК: «пароль в чистом виде»;
nonce из запроса: JlhRUAKiBCvdHg9I4ITPJA==";
created из запроса: "2012-08-15T08:16:34.495Z".
Пример soap-заголовка
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
rsa
Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">
s9uYfMe+iSmO5zfKl/ZFqzMLE2I=
EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">
JlhRUAKiBCvdHg9I4ITPJA==
2012-08-15T08:16:34.495Z
Контрольные примеры хеширования паролей
Контрольные примеры генерации хеша пароля с исходными данными и результатом:
Пример1:
Пароль (password): wss22wert
Случайное число (nonce): MzI2NjYyNzYxMQ==
Время (created): 2012-10-29T05:39:24Z
Результат:
passwordDigest = "88FDZSIoCwQT9zhMqpcekDvZwVo=" Пример2:
password = "test"
nonce = "8kqcOS9SFYxSRslITbBmlw=="
created = "2012-10-29T08:18:34.836Z"
passwordDigest = "LOzA3VPv+2hFGOHq8O6gcEXsc/k="
(результат декодирования из base64 в строку не всегда дает строку из чисел, в руководстве имеется ввиду набор байт сгенерированных случайным образом) Пример3:
password = "ic3"
nonce = "m4feQj9DG96uNY1tCoFBnA=="
created = "2012-10-29T08:49:58.645Z"
passwordDigest = "K80tK4TyuvjuXvMu++O8twrXuTY="
passwordDigest = "GkwwpX23bO588LKc3bNKgPFfE0E=" Пример4:
password = "tashkent" nonce = "NTQ2ODc5Nw==" created = "2013-01-24T22:00:00.111Z" passwordDigest = "JdB4xSYW94+IAZqTDXyyaSvaZCs="
Пример5:
password = "gd6Eh7Rf" nonce = "sL4s4rP/UzEeOnGeZ79JEw==" created = "2013-01-24T19:21:46.565Z" passwordDigest = "ia1+oDixfzd1Q6WNAlJ/jExJj5o="
Пример реализации хэширования пароля на Java
publicstaticString doPasswordDigest(String nonce, String created, String password) {
String passwdDigest = null;
try {
passwdDigest = doPasswordDigest(nonce, created, password.getBytes("UTF-8"));
} catch (Exception e) {
if (DO_DEBUG) {
LOG.debug(e.getMessage(), e);
}
}
return passwdDigest;
} publicstaticString doPasswordDigest(String nonce, String created, byte[] password) {
String passwdDigest = null;
try {
byte[] b1 = nonce != null ? Base64.decode(nonce) : newbyte[0];
byte[] b2 = created != null ? created.getBytes("UTF-8") : newbyte[0];
byte[] b3 = password;
byte[] b4 = newbyte[b1.length + b2.length + b3.length];
int offset = 0;
System.arraycopy(b1, 0, b4, offset, b1.length);
offset += b1.length; System.arraycopy(b2, 0, b4, offset, b2.length);
offset += b2.length; System.arraycopy(b3, 0, b4, offset, b3.length); byte[] digestBytes = WSSecurityUtil.generateDigest(b4);
passwdDigest = Base64.encode(digestBytes);
} catch (Exception e) {
if (DO_DEBUG) {
LOG.debug(e.getMessage(), e);
}
}
return passwdDigest;
}
|