Цифровой вход в PHP с использованием закрытого ключа, проверьте в C # - PullRequest
3 голосов
/ 13 мая 2009

Я работаю над функцией, которая требует от меня цифровой подписи короткой строки в PHP и проверки подписи строки в C #.

Мне бы очень хотелось использовать openssl_sign в PHP из-за его простоты, но вся информация, которую я могу найти в Google, указывает на то, что это не будет работать.

Есть некоторые внешние библиотеки , которые утверждают, что делают это хорошо, однако, поскольку это хобби-проект, я бы предпочел не покупать такую ​​библиотеку.

Так какие здесь альтернативы? Требуется полная совместимость между C # и PHP. Библиотеки помимо OpenSSL могут быть использованы.

Ответы [ 5 ]

2 голосов
/ 01 сентября 2009

Я сделал нечто очень похожее, используя API Bouncy Castle Crypto Похоже, PHP openssl_sign по умолчанию использует SHA1. Если вы используете что-то, отличное от значения по умолчанию, вам нужно изменить параметр алгоритма для GetSigner.

string base64pubkey = "<!-- BASE64 representation of your pubkey from open ssl -->";
RsaKeyParameters pubKey = PublicKeyFactory.CreateKey(Convert.FromBase64String(base64pubkey)) as RsaKeyParameters;
byte[] signature = Convert.FromBase64String("<!-- BASE64 representation of your sig -->");
byte[] message = Encoding.ASCII.GetBytes("Something that has been signed");


ISigner sig = SignerUtilities.GetSigner("SHA1WithRSAEncryption");
sig.Init(false, pubKey);
sig.BlockUpdate(message, 0, message.Length);
if (sig.VerifySignature(signature))
{
    Console.WriteLine("all good!");
}
1 голос
/ 13 мая 2009

Вы можете использовать для проверки цифровой подписи что-то вроде этого:

string publicKey = "some key";
// Verifying Step 1: Create the digital signature algorithm object
DSACryptoServiceProvider verifier = new DSACryptoServiceProvider();

// Verifying Step 2: Import the signature and public key.
verifier.FromXmlString(publicKey);

// Verifying Step 3: Store the data to be verified in a byte array
FileStream file = new FileStream(args[0], FileMode.Open, FileAccess.Read);
BinaryReader reader = new BinaryReader(file2);
byte[] data = reader.ReadBytes((int)file2.Length);

// Verifying Step 4: Call the VerifyData method
if (verifier.VerifyData(data, signature))
    Console.WriteLine("Signature verified");
else
    Console.WriteLine("Signature NOT verified");
reader.Close();
file.Close();
0 голосов
/ 13 мая 2009

Итак, глядя на this - у этого парня, кажется, есть асимметричная подпись и шифрование, работающие между PHP и C #. Подписание не должно быть проблемой, SHA * и MD * являются стандартными, и поэтому очень маловероятно, что они будут несовместимы (хотя вы должны смотреть на SHA256, поскольку MD * и SHA1 устарели из-за уязвимостей)

0 голосов
/ 13 мая 2009

Нам не хватает контекста относительно того, почему вам нужно подписать его. Вам может не понадобиться.

Важный вопрос: какие гарантии вам нужны от ваших данных?

Если все, что вам нужно сделать, это проверить целостность данных, то хеш выполнит эту работу. Если вам нужно проверить, откуда он, вы должны подписать его. Если вам нужны оба, хешируйте их, объедините полезные данные с хешем и подпишите все это.

Что касается кроссплатформенных библиотек ... вам действительно нужно беспокоиться об этом. SHA1 - это SHA1 - это SHA1, независимо от того, какая библиотека его сгенерировала. То же самое с генерацией и проверкой цифровых подписей. Используйте то, что проще всего в PHP, и то, что проще всего в C #. Если они оба настроены правильно, вам не нужно беспокоиться об этом.

0 голосов
/ 13 мая 2009

Есть ли причина, по которой вам нужно что-то такое сложное, как SSL-подпись? Разве вы не можете просто использовать простой односторонний хеш, такой как MD5 / SHA-1, в строке? Если все, что вам нужно, это проверить, что строка не была подделана, этого должно быть достаточно.

...