2011-07-07 36 views
1

我如何使用我從HTML5的keygen獲取的公鑰對PHP中的任何內容進行加密?有沒有標準功能?PHP加密返回HTML keygen公鑰

在此先感謝!

+0

就像其他人所說的那樣,目前還沒有用keygen支持IE。 –

回答

2

選定的答案是錯誤的!

如果您使用keygen元素來生成對稱加密密鑰,它將首先取消使用加密提供的任何保護。

通過不安全的通道發送對稱加密密鑰是使用加密的第一條規則。私人鑰匙就是這樣,私人的。更重要的是公鑰不應該被用作加密密碼,它可以用來加密數據和/或驗證數據,如果它是RSA密鑰類型的話。

凱基元素應該被用來生成首先創建其被註冊,並通過瀏覽器來提供certificate based authentication私鑰(RSA)一個簽名的公鑰&挑戰

要做進一步的研究證實這個​​答案,請參閱以下參考資料:

  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

This post包括一些關於<keygen />的冗長的文檔,但對我來說最大的收穫肯定是這個標籤在IE(任何版本)中不被支持;如果你能忽略掉IE,那麼這個帖子應該會有所幫助。

0

您可以使用可用的mcrypt函數在PHP(如果你有你的服務器上可用的庫擴展) - 例如

HTML表單中有一個字段:<keygen name="mykey" />

你的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

+1

keygen生成SPKAC格式的公鑰。第一組字節將是相同的,並且不同的字節不會有儘可能多的變化。使用SPKAC作爲對稱密碼的關鍵字可能會將安全性的有效字節數從原來的128個減少到大約50個。 – neubert

+1

這絕對是錯誤的答案。要使用從<keygen>元素提交的值非常不安全。 您基本上只是通過公共通道發送用於加密的密碼,因此否定了您通過對稱加密獲得的任何安全性。 SPKAC(簽名的公鑰和質詢)將用於證書認證,而不是用作對稱加密密鑰。 –

0

簽署生成公鑰,還千牛擁有SPKACs。我知道使用它們的唯一簡單方法是使用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')); 
+0

這實際上是正確的答案。幫助了我很多。非常感謝:) – JohnKiller

+0

您現在可以通過調用['openssl_export()'](1)發送給服務器的SPKAC值來使用PHP的OpenSSL擴展(本機支持)。 [1] http://php.net/manual/en/function.openssl-spki-export.php –