【问题标题】:RSA_sign or DSA_sign in PHP!PHP 中的 RSA_sign 或 DSA_sign!
【发布时间】:2010-11-10 01:53:24
【问题描述】:

我将在我的网站上实现许可证密钥生成器,但我对 php 的了解很少! 在我的(Cocoa)应用程序中,我集成了一个使用 RSA_sign 函数(在 C# 中)的系统验证......我想使用 paypal IPN 通知系统自动生成并向我的用户发送他们的许可证密钥......但是我真的不知道如何使用 RSA 密钥在 php 中对字符串进行签名!!!在 php 中,我只知道 openss_sign 函数,但它不是一回事! 还是更好、更容易使用 DSA 签名方法???

请帮忙!

提前感谢所有回复!!!

【问题讨论】:

    标签: licensing paypal rsa


    【解决方案1】:

    谢谢!你是对的!

    我发现问题出在我与 openssl_sign 一起使用的哈希字符串中! 我在objective-c中有这段代码:

    NSString *stringToEncript = @"test";
    
    const char *clearText = [stringToEncript UTF8String];
    
    unsigned char md[SHA_DIGEST_LENGTH];
    SHA1((unsigned char *)clearText, strlen(clearText), md);
    
    for(int i=0; i<SHA_DIGEST_LENGTH; i++)
        printf("%x", md[i]);
    

    在php中我写过:

    $stringToEncrypt = "test";
    
    $hash = sha1(utf8_encode($stringToEncrypt));
    echo $hash;
    

    第一个代码的输出是:

    a94a8fe5ccb19ba61c4c873d391e987982fbbd3

    第二个代码的输出是:

    a94a8fe5ccb19ba61c4c0873d391e987982fbbd3

    如您所见,漏掉了一个“0”!我哪里错了?

    【讨论】:

    • 如果你使用 "%02x" 作为你的 printf 字符串,你会得到你所期望的。不过,我想我看到了问题所在。 openssl_sign() 为您执行 SHA1 哈希 - 您只需将 $stringToEncrypt 传递给它。如果你自己做散列,它最终会签署散列的散列。
    • 好的!所以我做错的是输出!但是,当我以二进制编码生成签名字符串时,有一种方法可以在 php 中创建一个 .plist 文件,其中签名字符串是一个 NSData 对象?或者我必须对签名字符串进行 base64 编码,然后将其作为 NSString 对象存储在 plist 文件中?
    • PHP 可以输出二进制,当然。但是输出 base64 版本可能会更容易解析和调试。
    【解决方案2】:

    你想要openssl_sign()

    编辑:

    • 确保消息摘要是您要用于验证的摘要。
    • 不要通过将 base64 输出与另一个签名进行比较来测试它,而是通过验证 C# 代码中的签名来测试它。我相信具有相同数据的相同密钥的两个有效签名可能具有不同的二进制表示。

    【讨论】:

    • 但我之前尝试使用 C# 中的 RSA_sign 和 PHP 中的 openss_sign 对相同的字符串进行签名。 ...并且base64表示不同!如果你愿意,我发布我的代码!!!
    • 为了更加客观,我已经发布了 SHA1 的十六进制输出!有什么错误?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 2011-01-24
    • 2016-12-10
    相关资源
    最近更新 更多