Dijital C # doğrulamak, özel anahtar kullanarak PHP oturum

5 Cevap

Ben dijital PHP kısa bir dize imzalamak, ve C # dize'nın imzayı doğrulamak için bana ihtiyacı bir özellik üzerinde çalışıyorum.

Ben gerçekten sadeliği nedeniyle, PHP openssl_sign kullanmak istiyorum, ama ben Google'da bulabilirsiniz tüm bilgileri bu işe yaramaz olduğunu gösterir.

Bu iyi yapmak iddia some external libraries bu Doğrusu böyle bir kütüphane satın olmaz bir hobi projesi gibi ancak vardır.

Yani burada alternatifler nelerdir? C # ve PHP arasındaki tam olarak birlikte çalışabilirlik gereklidir. Kütüphane OpenSSL'de yanında kullanılabilir.

5 Cevap

I Bouncy Castle Crypto APIs ile çok benzer bir şey yaptık. PHP openssl_sign varsayılan SHA1 kullanır görünür. Eğer varsayılan başka bir şey kullanıyorsanız GetSigner için algoritma parametreyi değiştirmek gerekir.

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!");
}

Bu gibi dijital imza smth kontrol etmek için kullanabilirsiniz:

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();

SSL imzalama gibi karmaşık bir şey gereken bir nedeni var mı? Sadece dize MD5/SHA-1 gibi basit tek yönlü karma kullanamaz mıyız? Aradığınız tüm dize tahrif olmadığını doğrulama ise, bu yeterli olmalıdır.

Yani bakıyor this - Bu adam asimetrik imzalama ve PHP ve C # arasında çalışan şifreleniyor gibi görünüyor. İmzalama bir sorun olmamalı, SHA * ve MD * standart, ve (MD * ve SHA1 gibi SHA256 bakıyor olmalıdır nedeniyle rağmen açıklarına önerilmemektedir) bu yüzden uyumlu olmayabilir olacak ki çok çok düşüktür

Biz bunu imzalamak için neden ihtiyaç olarak bazı içerik kaçırıyorsun. Sen gerek olmayabilir.

Önemli soru şudur: Eğer veri ne garantiler gerekiyor?

Yapmanız gereken tüm verilerin bütünlüğünü doğrulamak ise, karma iş yapacak. Eğer nereden geldiğini doğrulamak için gerekiyorsa, bunu imzalamak gerekiyor. Hem ihtiyaç varsa, bunu karma karma ile yükü birleştirmek ve her şeyi imzalamak.

Çapraz platform kitaplıkları ile ilgili ... Eğer gerçekten bu konuda endişelenmenize gerek gerekir. Bir SHA1 SHA1 olursa olsun onu elde hangi kitaplığı, bir SHA1 olmasıdır. Dijital imzalar üreten ve doğrulama ile aynı şey. PHP kolay ne kullanın ve C # kolay ne kullanın. Ikisi de doğru kurmak ediyorsanız bu konuda endişelenmenize gerek olmamalıdır.