【问题标题】:PHP encrypt return with HTML keygen public keyPHP 使用 HTML keygen 公钥加密返回
【发布时间】:2011-09-30 11:21:11
【问题描述】:

如何使用从 HTML5 的密钥生成器获得的公钥在 PHP 中加密任何东西?有没有一个标准函数?

提前致谢!

【问题讨论】:

  • This post 包含一些关于<keygen /> 的冗长文档,但对我来说,最大的收获肯定是IE(任何版本)都不支持这个标签;如果您可以忽略 IE,那么该帖子应该会有所帮助。
  • 就像其他人提到的那样,目前还不支持带有 keygen 的 IE。

标签: php html encryption key generator


【解决方案1】:

选择的答案绝对不正确!

如果您使用 keygen 元素生成对称加密密钥,它将首先否定使用加密提供的任何保护。

通过不安全的通道发送对称加密密钥是使用密码学的首要规则之一。私钥就是这样,私有的。更重要的是,公钥不应该用作加密密码,如果它是 RSA 密钥类型,它可以用于加密数据和/或验证数据。

keygen 元素应该用于生成签名的公钥和挑战,方法是首先创建一个私钥 (RSA),该私钥被浏览器注册并用于提供certificate based authentication.

如需进一步研究确认此答案,请参阅以下参考资料:

  1. KeyGen w/ PHP
  2. OpenSSL SPKAC documentation
  3. Certificate Signing Request
  4. PHP OpenSSL SPKAC patch (available within the latest master branch)
  5. Standalone patch for PHP OpenSSL extension for working natively with SPKAC's sent from the browsers KenGen element
  6. PHP documentation for SPKI

【讨论】:

    【解决方案2】:

    生成签名的公钥,也称为 SPKAC。我知道使用它们的唯一简单方法是使用phpseclib, a pure PHP SPKAC implementation。例如。

    <?php
    include('File/X509.php');
    include('Crypt/RSA.php');
    
    $x509 = new File_X509();
    $x509->loadSPKAC('MIIBQzCBrTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwnnEID0RuUfmVbB1rNgsZ6BL8MtITio00wLJhQ075cvxcgllis1M4PhK6SKtm0tmSfXZTZz8jrbeczSFkdl6UjFYCXIrxnmcGmpB4A6fdKsBfFtmMOPLXLr5nGM+4DyOMZCZObbLOnsv7usimDpixk+juZ65Gmhb9rB+2MAKEbECAwEAARYJMTIzNDU2Nzg5MA0GCSqGSIb3DQEBBAUAA4GBAB99Nkdhzeazy0bTCb69Mp8Q3BDOgeMonUEg0ETlPaTX/y9HvwkgWHdMROQmc8JiDNTZZzpssrgdKtzsqQOyEIOHEKDbAXL3+GlglCaQ3g/72PbJPFusYdsPjEPYKXil6U1nCikikjaEZVM1HbzVFSmbEAuLwYwD1Z6LovYYaxr0');
    
    $pubkey = (string) $x509->getPublicKey();
    $rsa = new Crypt_RSA();
    $rsa->loadKey($pubkey);
    echo bin2hex($rsa->encrypt('whatever'));
    

    【讨论】:

    • 这实际上是正确的答案。帮了我很多。非常感谢你:)
    • 您现在可以通过在发送到服务器的 SPKAC 值上调用 ['openssl_export()'](1) 来使用 PHP 的 OpenSSL 扩展(本机支持)。 [1]php.net/manual/en/function.openssl-spki-export.php
    【解决方案3】:

    您可以使用 PHP 中可用的 mcrypt 函数(如果您的服务器上有可用的库扩展) - 例如

    您的 HTML 表单有一个字段:&lt;keygen name="mykey" /&gt;

    您的 PHP 可以执行以下操作:(未测试)

    $myKey = $_POST['mykey']; // this is your posted keygen value
    $encryptThis = 'This is the text I want to encrypt';
    $cipher = MCRYPT_BLOWFISH;
    $mode = MCRYPT_MODE_ECB;
    $iv_size = mcrypt_get_iv_size($cipher, $mode);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $encOutput = mcrypt_encrypt($cipher, $myKey, $encryptThis, $mode, $iv);
    
    // your encrypted text is now in the variable $encOutput
    

    有关 mcrypt 的更多信息,请参阅:http://uk3.php.net/manual/en/book.mcrypt.php

    【讨论】:

    • keygen 生成 SPKAC 格式的公钥。第一组字节将是相同的,不同的字节不会有尽可能多的变化。使用 SPKAC 作为对称密码的密钥可能会将有效的安全字节数从 128 减少到 50 左右。
    • 这绝对是错误的答案。使用从 <keygen> 提交的值元素非常不安全。您基本上只是通过公共渠道发送了用于加密的密码,因此否定了您从对称加密中获得的任何安全性。 SPKAC(签名的公钥和质询)将用于证书身份验证,而不是作为对称加密密钥。
    猜你喜欢
    • 2012-09-09
    • 2013-06-09
    • 1970-01-01
    • 2021-02-17
    • 2010-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    相关资源
    最近更新 更多