Статус: Участник
Группы: Участники
Зарегистрирован: 10.07.2013(UTC) Сообщений: 21 Поблагодарили: 2 раз в 2 постах
|
Кстати, в интернете не нашел реализации гостовской хэш-функции на php с набором параметров как в CryptoPro.
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 10.07.2013(UTC) Сообщений: 21 Поблагодарили: 2 раз в 2 постах
|
Автор: dmishin Да, хеш по госту: <DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411"/> А если считать хэш по sha1, и в digestmethod указать, что это sha1. а для signaturemethod указать гост, то ведь тоже должна получиться валидная подпись.
|
|
|
|
Статус: Сотрудник
Группы: Администраторы, Участники Зарегистрирован: 24.11.2009(UTC) Сообщений: 965 Откуда: Crypto-Pro
Сказал(а) «Спасибо»: 3 раз Поблагодарили: 174 раз в 152 постах
|
Нет, валидная ГОСТ подпись возвожна только для хеша по ГОСТ алгоритму. |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 07.08.2012(UTC) Сообщений: 123
Сказал(а) «Спасибо»: 4 раз Поблагодарили: 6 раз в 6 постах
|
Автор: Fomich Кстати, в интернете не нашел реализации гостовской хэш-функции на php с набором параметров как в CryptoPro. Я тоже не встречал реализаций. Пришлось писать обертку вокруг консольного приложения. Команды для вычисления хеша: cryptcp -hash -provtype 75 ./input.file -dir /path/to/output/ openssl dgst -md_gost94 -binary -out ./out.file ./input.file Отредактировано пользователем 18 июля 2013 г. 11:27:09(UTC)
| Причина: Не указана
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 16.07.2013(UTC) Сообщений: 35 Откуда: Пермь Сказал(а) «Спасибо»: 9 раз
|
Реализовал следующий алгоритм на C# + Javascript: 1)Подписываю на сервере нужный xml, забираю получившийся SignedInfo Исходный SignedInfo Код:
<SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" /><SignatureMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102001-gostr3411" /><Reference URI=""><Transforms><Transform Algorithm="http://www.w3.org/TR/1999/REC-xpath-19991116"><XPath xmlns:dsig="http://www.w3.org/2000/09/xmldsig#">not(ancestor-or-self::dsig:Signature)</XPath></Transform></Transforms><DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr3411" /><DigestValue>wMqeedhkBl4FMJ3bjYZjwLFdkwOsK/a0AaNjt+o+pxk=</DigestValue></Reference></SignedInfo>
2)Часть на C#. генерируем хэш от канокализированного SignedInfo и возвращаем его в виде base64 Код:
public String GenerateSignedInfoHash()
{
//исходный signedInfo. кавычки экранированы символами \
string signedInfo = "<SignedInfo><CanonicalizationMethod Algorithm=\"http://www.w3.org/TR/2001/REC-xml-c14n-20010315\" /><SignatureMethod Algorithm=\"urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102001-gostr3411\" /><Reference URI=\"\"><Transforms><Transform Algorithm=\"http://www.w3.org/TR/1999/REC-xpath-19991116\"><XPath xmlns:dsig=\"http://www.w3.org/2000/09/xmldsig#\">not(ancestor-or-self::dsig:Signature)</XPath></Transform></Transforms><DigestMethod Algorithm=\"urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr3411\" /><DigestValue>wMqeedhkBl4FMJ3bjYZjwLFdkwOsK/a0AaNjt+o+pxk=</DigestValue></Reference></SignedInfo>";
XmlDocument signedInfoXml = new XmlDocument();
signedInfoXml.LoadXml(signedInfo);
//выолняем канонизация
XmlDsigC14NTransform xmlTransform = new XmlDsigC14NTransform(false);
xmlTransform.Algorithm =SignedXml.XmlDsigC14NTransformUrl;
xmlTransform.LoadInput(signedInfoXml);
//получаемп хэш по госту
HashAlgorithm myhash = HashAlgorithm.Create("GOST3411");
byte[] hashResult =xmlTransform.GetDigestedOutput(myhash);
string canonicalHashedSignedInfo = Convert.ToBase64String(hashResult);
return canonicalHashedSignedInfo;
}
результат выполнения этого метода отдается клиенту 3)Генерация SIgnatureValue на Javascript, на вход приходит результат C# функции Код:
//генерация SignatureValue
function generateSignatureValue(base64Hash) {
var oStore = CreateObject("CAPICOM.Store");
oStore.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE, CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED);
try {
var certificate = oStore.Certificates.Item(4);
var hashObject = CreateObject("CAdESCOM.HashedData");
hashObject.Algorithm = CADESCOM_HASH_ALGORITHM_CP_GOST_3411;
var temp = utils.stringToHex(B64.decode(base64Hash));
hashObject.Hash(temp);
var rawSignature = CreateObject("CAdESCOM.RawSignature");
var signatureHex = rawSignature.SignHash(hashObject, certificate);
var reversedSignatureString = utils.reverse(utils.hexToString(signatureHex));
return B64.encode(reversedSignatureString);
} catch (e) {
alert(e);
}
};
//вспомогательные функции
var utils = {
reverse: function (str) {
var newStr = '', i;
for (i = str.length - 1; i >= 0; i--) {
newStr += str.charAt(i);
}
return newStr;
},
d2h: function (d) {
var res = d.toString(16).toUpperCase();
if (res.length == 1) {
res = '0' + res;
}
return res;
},
h2d: function (h) {
return parseInt(h, 16);
},
stringToHex: function (string) {
var hex = '';
for (var i = 0; i < string.length; i++) {
hex += this.d2h(string.charCodeAt(i));
}
return hex;
},
hexToString: function (hex) {
var string = '';
for (var b = 0; b < hex.length; b += 2) {
string += String.fromCharCode(parseInt(hex.substr(b, 2), 16));
}
return string;
}
};
для работы с base64 использую библиотеку http://jsbase64.codeplex.com/затем беру подписанный xml и заменяю в нем исходный SignatureValue на полученный от клиента. Однако подпись проверку на валидность не проходит. В чем может быть ошибка? Всю голову себе уже сломал.
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 10.07.2013(UTC) Сообщений: 21 Поблагодарили: 2 раз в 2 постах
|
Нужно брать хэш от base64 encoded значения. Хотя я не знаю как работает xmlTransform.GetDigestedOutput(myhash); и еще добавь hashedData.DataEncoding = 0x01;//CADESCOM_BASE64_TO_BINARY; Отредактировано пользователем 18 июля 2013 г. 15:39:16(UTC)
| Причина: Не указана
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 16.07.2013(UTC) Сообщений: 35 Откуда: Пермь Сказал(а) «Спасибо»: 9 раз
|
то есть на сервере мне хэш про госту не брать, только канонизировать SignedInfo, преобразовать в base64 и передать на клиент? на клиенте надо снова выполнять преобразования к base64 и затем брать хэш? надо ли конвертировать в hex перед взятием хэша? Отредактировано пользователем 18 июля 2013 г. 15:42:09(UTC)
| Причина: Не указана
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 10.07.2013(UTC) Сообщений: 21 Поблагодарили: 2 раз в 2 постах
|
Автор: cross Нет, валидная ГОСТ подпись возвожна только для хеша по ГОСТ алгоритму. я имел ввиду, что получится валидная подпись, но конечно же она не будет соответствовать ГОСТу
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 10.07.2013(UTC) Сообщений: 21 Поблагодарили: 2 раз в 2 постах
|
Автор: fomenko то есть на сервере мне хэш про госту не брать, только канонизировать SignedInfo, преобразовать в base64 и передать на клиент? на клиенте надо снова выполнять преобразования к base64 и затем брать хэш? надо ли конвертировать в hex перед взятием хэша? на сервере берешь хэш от base64 encoded SignedInfo. И передаешь клиенту на подпись. На клиенте перед подписью уже не надо будет производить никаких действий Отредактировано пользователем 18 июля 2013 г. 15:47:49(UTC)
| Причина: Не указана
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 16.07.2013(UTC) Сообщений: 35 Откуда: Пермь Сказал(а) «Спасибо»: 9 раз
|
Не могу провести верификацию, проверьте, пожалуйста, кто реализовывал получение SIgnatureValue, получиться ли у вас сгенерировать корректный SIgnatureValue для данного XML Поправил алгоритм следующим образом 1)Канонизирую и кодирую в base64 (на сервере) Код:
public String GenerateSignedInfoHash()
{
//исходный signedInfo. кавычки экранированы символами \
string signedInfo = "<SignedInfo>"
+"<CanonicalizationMethod Algorithm=\"http://www.w3.org/2001/10/xml-exc-c14n#\"/>"
+"<SignatureMethod Algorithm=\"http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411\"/>"
+"<Reference>"
+"<Transforms>"
+"<Transform Algorithm=\"http://www.w3.org/2000/09/xmldsig#enveloped-signature\"/>"
+"</Transforms>"
+"<DigestMethod Algorithm=\"http://www.w3.org/2001/04/xmldsig-more#gostr3411\"/>"
+"<DigestValue>rQRcvnfGVu2YI/ryIGYaeBmwFPtMTYYKudSvD8mzbEs=</DigestValue>"
+"</Reference>"
+"</SignedInfo>";
XmlDocument signedInfoXml = new XmlDocument();
signedInfoXml.LoadXml(signedInfo);
//выолняем канонизация
XmlDsigC14NTransform xmlTransform = new XmlDsigC14NTransform(false);
xmlTransform.Algorithm =SignedXml.XmlDsigExcC14NTransformUrl;
xmlTransform.LoadInput(signedInfoXml);
MemoryStream memoryStream = (MemoryStream)xmlTransform.GetOutput();
string canonicalSignedInfo = Convert.ToBase64String(memoryStream.ToArray());
return canonicalSignedInfo;
}
на выходе получаю канонизированный SignedInfo в Base64: PFNpZ25lZEluZm8+PENhbm9uaWNhbGl6YXRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzEwL3htbC1leGMtYzE0biMiPjwvQ2Fub25pY2FsaXphdGlvbk1ldGhvZD48U2lnbmF0dXJlTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8wNC94bWxkc2lnLW1vcmUjZ29zdHIzNDEwMjAwMS1nb3N0cjM0MTEiPjwvU2lnbmF0dXJlTWV0aG9kPjxSZWZlcmVuY2U+PFRyYW5zZm9ybXM+PFRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNlbnZlbG9wZWQtc2lnbmF0dXJlIj48L1RyYW5zZm9ybT48L1RyYW5zZm9ybXM+PERpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDQveG1sZHNpZy1tb3JlI2dvc3RyMzQxMSI+PC9EaWdlc3RNZXRob2Q+PERpZ2VzdFZhbHVlPnJRUmN2bmZHVnUyWUkvcnlJR1lhZUJtd0ZQdE1UWVlLdWRTdkQ4bXpiRXM9PC9EaWdlc3RWYWx1ZT48L1JlZmVyZW5jZT48L1NpZ25lZEluZm8+ Отредактировано пользователем 18 июля 2013 г. 17:56:39(UTC)
| Причина: Не указана
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close