www.gobuy.cheap / data_encryption
Requires
- monolog/monolog: ^3.6
- psr/log: ^3.0
Requires (Dev)
- humbug/box: ^2.7
- phpunit/phpunit: ^11.1
README
- 关于库
- 高级加密(CMS 和 PKCS),包括信任链和Diffie-Hellman。
- Diffie-Hellman
- 椭圆曲线Diffie-Hellman(ECDH)
- 证书信息
- 获取证书吊销列表(CRL)
- 异常处理
- 初始工作
- 贡献
- 许可
- 支持
- 作者
- 供您参考的书籍。
用信心加密,用我们的API保持安全。您的数据在传输过程中的保护盾牌——由我们的加密提供动力。保护您数据的每一比特、字节和脉搏。相信我们,确保您的秘密在移动中安全。我们提供您可以信赖的加密,您可以信赖的安全。
关于库
在当今数字时代,确保用户数据在传输中的安全至关重要,我们的加密API旨在提供强大的保护。通过利用高级加密标准,我们确保您的数据被转换为只有授权方才能解密的安全格式。这不仅保护数据免受未经授权的访问,而且在整个传输过程中保持其完整性。用户可以依赖我们的API提供无缝且安全的加密体验,使他们的应用程序更能抵御数据泄露和网络威胁。
我们的加密阶段涉及多层安全措施,以有效地伪装数据。首先,数据使用强大的算法进行加密,将其转换为需要正确解密密钥才能读取的密文。此过程确保即使数据被截获,恶意行为者也无法访问。此外,我们的API支持密钥管理协议,保护加密密钥本身,增加了一层保护。通过使用我们全面的加密阶段,用户可以放心,他们的敏感信息在其旅程的每个步骤中都受到保护。
我们深知您应用程序的安全性至关重要,因此我们的加密API设计时考虑到了这一点。从初始加密到密钥管理再到最终解密,每个阶段都经过精心设计,以提供最大程度的安全保障。我们的解决方案持续更新,以符合最新的安全标准和实践,确保您的数据在日益变化的威胁环境中保持安全。请放心使用我们的加密阶段,以保护您的数据安全,让您能够专注于为用户提供卓越体验,同时不牺牲安全性。
特性
- 易于使用的CMS:使用我们用户友好的CMS高效管理您的内容。
- PKCS7加密:通过高级PKCS7签名、加密、解密和签名验证功能确保您的数据安全。
- Diffie-Hellman的:使用DH密钥交换机制进行安全保护。
- 椭圆曲线Diffie-Hellman (ECDH):与普通DH相比,ECDH通过更短的关键长度提供更高的安全性。例如,ECDH中的256位密钥与DH中的3072位密钥提供相当的安全性。这使得ECDH在计算资源和通信带宽方面更加高效。
- 内置日志记录:由Monolog提供的全面日志记录。
- 异常处理:强大的错误管理以确保平滑运行。
要求
- PHP 7.4或更高版本:确保您的服务器正在运行PHP版本7.4或更高版本。
- 启用OpenSSL扩展:确保在PHP配置中启用了OpenSSL扩展。
- Composer:依赖管理通过Composer处理。
- 确保您的PHP环境满足要求。
CMS 功能
- 访问CMS界面,轻松管理您的内容。
内置日志
日志由Monolog管理。您可以在config/logging.php
文件中配置日志设置。
安装
使用Composer安装库
composer require www.gobuy.cheap/data_encryption
用法
要使用CMS签名者,您需要包含Composer自动加载文件,并使用实例$gobuy
开始调用类成员。如果您的类对象名称不同,类名为GoBuyEncryption
。类构造函数不接受任何参数。
检查是否加载了OpenSSL模块。
// Load the OpenSSL module if (!extension_loaded('openssl')) { die('OpenSSL extension is not loaded.'); }
对于Laravel用户。您必须将我们的对象作为参数注入到您的方法中,才能像下面那样使用类成员。或者,您可以简单地实例化我们的类。
protected $gobuy; public function index( Request $req, GoBuyEncryption $gobuy ) { $this->gobuy = $gobuy; }
对于输出显示和显示OpenSSL错误,请使用下面的辅助工具,以方便您使用。
$gobuy->output( "Some output message", "Title of the output" ); // Display errors if string or var_dumps if an array. $gobuy->showAnyError( ); // Displays all openssl_error_string() $gobuy->log->warning('Foo'); // Error file is in public/log/
您还可以选择将输出记录在不同的位置。然后尝试以下解决方案。
$gobuy->initLogger( "ERR_NAME" ) ->thenSetPath( $root."app/log.log" ); $gobuy->log->info('The file has been successfully created.');
对于Laravel用户,根路径$this->getRoot()
停止在laravel的app
文件夹和vendor
所在的目录。App文件夹和vendor应位于同一目录中,以便此类方法能够正常工作。如果您不使用它,则文件预期将在public
文件夹中。要使用,您可以说:
$root = $gobuy->getRoot( ); // You could proceed to generate your own path, if you choose not to use ours. $gobuy->create( $folderName ); // This helper helps you create new folders only in the 'app' folder. $gobuy->checkAndCreateFile($root."app/CMS/data.txt"); // This helper helps you create a new folder, if it does not exist, and its file. Supply full path with the file name. $gobuy->folderExistsOrCreate( $root."/FOO" ); // Create folder if it does not exist.
级联加密阶段
我们将加密阶段分层,以加强您的数字足迹,并确保您的数字存在安全。这也使得中间人攻击者或任何其他密码分析者很难使用现有的方法之一来找出密钥。如果您希望对现有加密(我们建议这样做)添加更多加密层,只需调用方法harden(...)
。
$hardened = $gobuy->harden( $data, $strongKey );
在接收端调用方法ease()
以返回到使用$encryptedData
的工作。您也可以用它来隐藏注册用户时的密码(非常有用)。
@inject('gobuy', 'App\Services\GoBuy') //Blade @php $encryptedData = $gobuy->ease( $hardened, $strongKey ); @endphp
在哈希密码后,简单地调用此方法以帮助进一步扭曲密码,使其对任何可能存在于输出中的密码分析者更加困难。这是对称的 - 意味着您和客户端都需要相同的密钥。
$damagedPassword = $gobuy->damageThis( $password, $strongKey );
调用以下方法来反转此操作。这是对称的 - 意味着您和客户端都需要相同的密钥。
$gobuy->restore( $damagedPassword, $strongKey );
对密码、消息或数据调用以下方法,以获得更强大的伪装。
$veiled = $gobuy->veil( "abcdefghijklmnopqrstuvwxyz0123456789", $key );
调用以下方法来取消上述操作。这是对称的 - 意味着您和客户端都需要相同的密钥。
$originalData = $gobuy->unveil( $veiled, $strongKey );
调用cipher
对数据进行加密。由于我们采用了更高级的填充方式,因此我们的输出相当健壮。您可以通过调整参数$itrCount
来选择您想要的加密阶段数。该值越高,加密强度越强,分析师检测越困难。请注意,当您增加计数时,可能会产生额外的开销。12
是推荐的值;除非您确信您的CPU或服务器可以处理更高的值。在构建这些加密块时,我们对现有威胁进行了仔细考虑。您的输入在传输过程中被有效地伪装,以确保安全地发送到接收端。如果您没有提供$itrCount
和$padding
参数,我们将内部提供。我们的方案是严格的且被推荐的,除非您有计划使用的特定标准。
$cipher = $gobuy->cipher( "Hello, world!!!!", $strongKey, $itrCount, $padding ); // The last two arguments are optional
在接收端,只需轻松调用方法decipher()
即可将数据返回到$encrypted
状态。
//Blade @php $deciphered = $gobuy->decipher( $cipher, $strongKey, $padding ); // The last argument is optional. @endphp
使用以下内容可以返回OpenSSL中所有可用加密方法的数组列表。
//Blade @php $gobuy->getEncMethods( ); @endphp
在深入研究高级功能之前,请记住此方法,它可以帮助您快速生成PEM格式的私钥和公钥对。该方法返回一个包含密钥的数组。第一个元素是私钥,第二个是公钥。
list( $privateKey, $publicKey ) = $gobuy->genKeyPair();
高级加密(CMS 和 PKCS),包括信任链和Diffie-Hellman。
签名文件
在签名、加密、解密和验证之前,您需要设置要处理文件的必要路径。
/** * The input and output files could be ".cms" or ".p7m". * Do not use "file://" just "./folder/file.txt" for example. */ // Set the input filename for the data to be signed $gobuy->setInputFilename($root."app/path/to/the/original/message/data.txt"); // This is the human-readable message you wish to encrypt. // Set the path to the sender's certificate $gobuy->setSenderCertPath($root."app/path/to/sender/certificate.pem"); // Set the path to the sender's private key with password. Default pass is "12345", in case you don't specify password. $gobuy->setSenderPrivateKey($root."app/path/to/sender/private_key.pem", "12345"); // Or // Set the password for the sender's private key, then call "setSenderPrivateKey" with only first argument. $gobuy->setPrivateKeyPassword("12345"); // Optional: Set email headers for the S/MIME message // Below are optional $gobuy->setCMSEncoding( OPENSSL_ENCODING_SMIME ); $gobuy->setCMSCipherAlgo( OPENSSL_CIPHER_AES_128_CBC ); $gobuy->setHeader([ "From" => "sender@example.com", "To" => "recipient@example.com", "Subject" => "Signed Data" ]);
选择 .pem、.crt 和 .key 扩展名进行数据存储
- PEM:如果您需要一个可以处理不同类型加密数据(证书、私钥、公钥)的灵活格式,
.pem
通常是最佳选择。它被广泛应用于各种应用程序,因为它可以存储不同类型的数据。 - CRT:当您需要特别存储公共证书时,请使用
.crt
。这种格式清晰且明确,适用于分发公共证书。 - KEY:当您需要将私钥与其他数据类型分开存储时,请使用
.key
。这有助于保持安全性和清晰度,因为文件仅被理解为仅包含私钥。
文件内容示例
-
.pem:
-----BEGIN CERTIFICATE----- MIIC+zCCAeOgAwIBAgIJAL3QkuepS6UnMA0GCSqGSIb3DQEBCwUAMIGVMQswCQYD ... -----END CERTIFICATE-----
-
.crt:
-----BEGIN CERTIFICATE----- MIIC+zCCAeOgAwIBAgIJAL3QkuepS6UnMA0GCSqGSIb3DQEBCwUAMIGVMQswCQYD ... -----END CERTIFICATE-----
-
.key:
-----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEA1zC3qv2upZ5F+3OofOw8uAL5Do2RWPMJv/mh2u83hRxgpT7W ... -----END RSA PRIVATE KEY-----
最佳实践
- 当您需要处理多种类型的加密数据时,请使用
.pem
文件以保持灵活性。 - 当分发公共证书时,请使用
.crt
文件以保持清晰度。 - 请使用
.key
文件以安全地存储和管理私钥。
如果您是新手,不知道如何为发送者和接收者获取密钥和自签名证书,请按照以下步骤快速获取它们
$out = $gobuy->createPrivateKey( sprintf( "%sapp/Output/private_key.pem", $root ) );
生成PEM格式的私钥并保存到您的.pem
文件中。返回证书的内容。
$out = $gobuy->createPublicKey( sprintf( "%sapp/Output/private_key.pem", $root ), sprintf( "%sapp/Output/public_key.pem", $root ) );
从私钥中提取公钥并将其保存到您指定的文件中。
$out = $gobuy->createCSR( sprintf( "%spath/to//private_key.pem", $root ), sprintf( "%sapp/Output/crs.pem", $root ), sprintf( "%spath/to/openssl.cnf", $root ) );
其中openssl.cnf
应如下所示
[ req ] default_bits = 2048 default_md = sha256 default_keyfile = private.pem prompt = no encrypt_key = no # distinguished_name section distinguished_name = req_distinguished_name # attributes section attributes = req_attributes # x509 extensions section x509_extensions = v3_req [ req_distinguished_name ] countryName = DE stateOrProvinceName = Hessen localityName = Frankfurt organizationName = GoBuy organizationalUnitName = Tech Team commonName = www.gobuy.cheap emailAddress = info@gobuy.cheap [ req_attributes ] challengePassword = A3D3GHP unstructuredName = My Unstructured Name [ v3_req ] subjectAltName = @alt_names [ alt_names ] DNS.1 = example.com DNS.2 = www.example.com
解释 openssl.cnf
文件内容
[req] 部分
[ req ]
本节定义了OpenSSL "req"命令的设置,该命令用于创建证书请求(CSR)。
default_bits = 2048
将RSA密钥的默认密钥大小设置为2048位。这是安全和性能之间的一种良好平衡。
default_md = sha256
将默认消息摘要算法设置为SHA-256。SHA-256被广泛使用,并提供了一个良好的安全级别。
default_keyfile = private.pem
指定默认的私钥文件名,如果未显式提供,则将密钥命名为private.pem
。
prompt = no
此选项指示OpenSSL不要提示用户输入区分名称字段。相反,它将使用配置文件中指定的值。
encrypt_key = no
此选项指定是否应该加密私钥。no
表示私钥将不会被加密。如果您想加密私钥,请将其更改为yes
。
区分名称部分
distinguished_name = req_distinguished_name
指定配置文件中包含区分名称字段的节。它引用了[req_distinguished_name]
节。
属性部分
attributes = req_attributes
本部分指定了配置文件中包含可选属性的章节。它指的是[req_attributes]
章节。
X.509 扩展部分
x509_extensions = v3_req
本部分指定了配置文件中包含X.509 v3扩展的章节。它指的是[v3_req]
章节。
[req_distinguished_name] 部分
[ req_distinguished_name ]
本章节定义了证书请求中将包含的区分名称(DN)的字段。
countryName = DE
国家代码,是两个字母的ISO国家代码。例如,美国的代码是DE
。
stateOrProvinceName = Hessen
州或省的全称。
localityName = Frankfurt
城市或地区的名称。
organizationName = GoBuy
组织的法律名称。
organizationalUnitName = Tech Team
组织内的组织单元或部门的名称。
commonName = www.gobuy.cheap
通用名称(CN),通常是服务器或用户的完全合格域名(FQDN)。
emailAddress = info@gobuy.cheap
与证书请求关联的电子邮件地址。
[req_attributes] 部分
[ req_attributes ]
本章节定义了可以包含在证书请求中的可选属性。
challengePassword = A3D3GHP
一个可选的挑战密码,可以用来验证证书吊销请求。
unstructuredName = My Unstructured Name
一个可选的无结构名称,可以用来提供附加信息。
[v3_req] 部分
[ v3_req ]
本章节定义了可以包含在证书请求中的X.509 v3扩展。
subjectAltName = @alt_names
指定应在证书中包含主题备用名称(SAN)。它指的是[alt_names]
章节。
[alt_names] 部分
[ alt_names ]
本章节定义了可以包含在证书中的主题备用名称(SAN)。
DNS.1 = example.com
指定第一个SAN,它是一个DNS名称。在这里,它设置为example.com
。
DNS.2 = www.example.com
指定第二个SAN,它是一个DNS名称。在这里,它设置为www.example.com
。
使用openssl.cnf
文件来配置创建证书请求的各个方面。[req]
章节设置请求的一般选项,如密钥大小、消息摘要和文件名。[req_distinguished_name]
章节指定区分名称的字段,而[req_attributes]
章节允许包含可选属性。[v3_req]
章节用于包含X.509 v3扩展,如主题备用名称,这些扩展在[alt_names]
章节中定义。此配置确保CSR以标准格式包含所有必要信息。
$out = $gobuy->generateSelfSignedCert( sprintf( "%sapp/Output/private_key.pem", $root ), sprintf( "%sapp/Output/root_cert.pem", $root ), sprintf( "%sapp/Output/openssl.cnf", $root ), $days );
使用上述API生成自签名证书。
我们正在通过信任链来保护您。因此,我们为$untrusted_certificates_filename
生成了一个中间证书。这通常是为了提供额外的安全层,并且还需要更多的证书来完成验证阶段。
list( $caCert, $caKey, $csr ) = $gobuy->generateCACertAndPrivateKey( $certOutPath, $keyOutPath, $csrOutPath); // Self-signed CA certificate needed to sign the intermediates.
您可以在外部结构的CA
文件夹中找到此CA证书。
$dn= array( [ 'countryName' => 'AU', 'stateOrProvinceName' => 'State', 'localityName' => 'City', 'organizationName' => 'Organization', 'organizationalUnitName' => 'Organizational Unit', 'commonName' => 'intermediateCA', 'emailAddress' => 'email@example.com' ], [ 'countryName' => 'US', 'stateOrProvinceName' => 'State', //... ], [ 'countryName' => 'DE', 'stateOrProvinceName' => 'State', //... ] ); $bundleArr = $gobuy->generateIntermediates( $caCert, $caKey, $dn, 3 );
第四个参数是迭代次数 - 将生成的中间证书的数量。随着它的增加,您应监视功耗和CPU性能。还要监视内存使用情况。$dn
数组的长度必须与迭代次数匹配,否则会抛出错误。
$intermediatCert = $gobuy->getInterCert( $bundleArr ); $intermediatePrivateKey = $gobuy->getInterKey( $bundleArr );
使用上述两种方法,您可以得到捆绑包中的最后一个中间证书及其相应的密钥。这些对于签名/创建端实体(发送方)证书是必要的。
// Now the end entity's certificate can be created. End entity is also the sender. The sender needs to submit a Certificate Signing Request (CSR) for a certificate to be issued to them. $days = 365; // How long the certificate will be valid. You can increase this further $serial = rand(); // The serial number of issued certificate. If not specified it will default to 0. $gobuy->endEntityCertPath = $gobuy->root."app/endEntityCert.pem"; // endEntity is same as sender list( $endEntityCert, $endEntityCertPath ) = $gobuy->signEndEntityCert( "path/to/stored/end_entity/csr.pem", $intermediatCert, $intermediatePrivateKey, $days, $serial );
对于端实体的CSR,您可以使用上面生成的发送方CSR。发送方证书的外观可能如下所示。这是一个PEM格式。
-----BEGIN CERTIFICATE----- MIID1DCCArygAwIBAgIEBiKpijANBgkqhkiG9w0BAQsFADCBnDELMAkGA1UEBhMC VVMxDjAMBgNVBAgMBVN0YXRlMQ0wCwYDVQQHDARDaXR5MRUwEwYDVQQKDAxPcmdh bml6YXRpb24xHDAaBgNVBAsME09yZ2FuaXphdGlvbmFsIFVuaXQxFzAVBgNVBAMM DmludGVybWVkaWF0ZUNBMSAwHgYJKoZIhvcNAQkBFhFlbWFpbEBleGFtcGxlLmNv bTAeFw0yNDA3MTMxNjAxNDlaFw0yNTA3MTMxNjAxNDlaMGYxCzAJBgNVBAYTAkRF MQwwCgYDVQQIDANFRkYxDDAKBgNVBAcMA1NTUzEMMAoGA1UECgwDQUFBMQswCQYD VQQLDAJERDEMMAoGA1UEAwwDRkZGMRIwEAYJKoZIhvcNAQkBFgNXRUUwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCjqU1MMUFRmjmey3lFJQJd0sxUnw/4 U7aWH59v1nNzpPk7AE6nGHfWbBNHfYHSXoU2gkRnu8mjSW3qsslx3fj6J16K0bRO +tnTiR57d5/XQx1wvKi2vnB3w9uoMKa8sE9qaPddhwYBet0ieJx8QaQDqQLFltK8 Q9G4jnRWTJtCa6YYM8oCIdGgiKNrwn8BdRT5Y8EC5yiQN6FGOQ/zdPMlAbMPLvfZ rHrysmRVuz/hnJS5dgtA4X9bzQaPWf+FYaknqojVqwY/1u4Im2wSGI4Ltuc4vfCC VaEaD8aqqaYEB9Mj7AOvcvj6P+NRSevS73wxee1WowvYUekCp8xm3Ac5AgMBAAGj UzBRMB0GA1UdDgQWBBS6aL9bxdLvvp82/mYC1ggLBTjJwTAfBgNVHSMEGDAWgBTv mEZ9gJEk5WsC7yeF52vOpG4MeTAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB CwUAA4IBAQA+Lezlhy6Iy0mVWjaAy5AUX5CKalkAl15gb5hNJw86gy9VyJ0a0pvK zIOuJ+vMW42AJRs0tquj/2sFTqZYi9LRe1lrUBTPq/N7YlpzQnS+gX7ATnvgq9+X dO6fa4PTO9vtDlX584rUYNhT5hi+6Djv9y9TWGwSGAraWQJyM4icvUYNvzLhO4AP z4kSV5dC7qVxASP2jFYTnJUIbRnb8C0GMjJochdUy6MHEzdvQCq5Ch4oDF/ym9rM d9GlPEDYVFRe0vuBfbffVQjvwc5JsdtPknmwSL4H2zUK7FzbZRK+OkfvFLgNO1mb kfNwUfGUxzkIpYd2s4k8NbuZzrlHzPFe -----END CERTIFICATE-----
级联中间证书
$gobuy->cascadeUntrustedCertificate( $bundleArr[0], "path/to/store/concatenated_cert.pem" );
输出
输出将如下所示
-----BEGIN CERTIFICATE----- MIIDwzCCAqugAwIBAgIEKy4j1jANBgkqhkiG9w0BAQsFADBVMQ4wDAYDVQQDDAVN eSBDQTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yNDA2MjIwOTMyNTFaFw0yNTA2 MjIwOTMyNTFaMIGcMQswCQYDVQQGEwJVUzEOMAwGA1UECAwFU3RhdGUxDTALBgNV BAcMBENpdHkxFTATBgNVBAoMDE9yZ2FuaXphdGlvbjEcMBoGA1UECwwTT3JnYW5p emF0aW9uYWwgVW5pdDEXMBUGA1UEAwwOaW50ZXJtZWRpYXRlQ0ExIDAeBgkqhkiG 9w0BCQEWEWVtYWlsQGV4YW1wbGUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEAxjZkwvojmHy0248+BqPCrKYt7BbsKAQ9NcdUh0vjvDST8sjIC0Hp z3xpMUa8j4M3akeiUyGzO/vVapNQWEhll5yMgf5YcKsaDLE6Ia8syBud+QwY4QKA H/cDtfU+No2ciBaO9mmLQb93SnVJC6ugSf69psrSruxqp9aZXBZiUHRqy1I7+zVZ DiKdeb30GFg44KN8sJojvgq8Rsp3htxfq+uv7NStQqux8G+YGzB8GKhwuzlLkxPc GfKNL9w7imftCpo4o8+y31Y6O7BzFPPb/BRe/UqJJ0xTFRhzZMdh8OFEFzAuLEP7 2XAgOj09utbcpD8Zgc0uTJK9cGv5nQ5KrwIDAQABo1MwUTAdBgNVHQ4EFgQUBb5J Mf4guZY/t5i8VG2xW8o9VxAwHwYDVR0jBBgwFoAU0+jIdL2nZDtnftLwZIFxDzh5 JhgwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEARYCKOoLf8hB2 tld+puoUlmVRplZztD1G+SKovg32TnfFqaUXzLu5LD+fq9ttDzs1QDkpQminUi1r GACjZ86Z5QIf1t+hI9XHqpfkWyO69kW7Ue7DANGssDITV5YmZnErMP9/s3GwKcZZ V4iJot3cyAaMxKFT/sIx6OOG6gdPLGOOOZsYQ317yaML/d/rPOKo4Zg6V7Yh9zl+ bVHuK/m+SFbXNFQUrzj/hi/vqSoykBJbdesIh+0Qs2FEhyN81touNLQPQq2FKZhr +3amghXhlplXonmQ+FMepLBglBJbvfeRMVAhYeE/zHr3p/QRl5rblWdqRmxTfWa+ qjfiLf+t8Q== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDwzCCAqugAwIBAgIEDMKr+DANBgkqhkiG9w0BAQsFADBVMQ4wDAYDVQQDDAVN eSBDQTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yNDA2MjIwOTMyNTFaFw0yNTA2 MjIwOTMyNTFaMIGcMQswCQYDVQQGEwJVUzEOMAwGA1UECAwFU3RhdGUxDTALBgNV BAcMBENpdHkxFTATBgNVBAoMDE9yZ2FuaXphdGlvbjEcMBoGA1UECwwTT3JnYW5p emF0aW9uYWwgVW5pdDEXMBUGA1UEAwwOaW50ZXJtZWRpYXRlQ0ExIDAeBgkqhkiG 9w0BCQEWEWVtYWlsQGV4YW1wbGUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEApvbaqixp819WRemwd8Jtth+Vz5SF68x0z65TX9ObOmz2GaNzzh0O F4BvrbiRfMMzOlynIySNg/PyqH+BGO5PGuxrOeGDz4F1Y9s75OUczXwQULmOcm7G qPp0ZktghLZAiKhUXx6VnyAF9Paic8Jy8715Xt3/gSDzSjEa2hZJNn9i49HtSCf3 aWLPTgtIMPCDvyfvRWHau5GcEoBo+EybR5a6Fos8prBJ1c7i93dxwTcxFiILa5bm BxpyU1LsN3VfGzoZ/4GvhQs+aEVyg8tqk45FQQXNGa1mDSX7eG72KHEUacr9EeAn myMkiGvtGtWABNJRf326QpzMlvhH0+QB0wIDAQABo1MwUTAdBgNVHQ4EFgQUZ3vM U2ujf6V1UWAL0JZicNsy4NowHwYDVR0jBBgwFoAURKgsE5iWXR2+apEW43Cl2X1j GUYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAidpyQ0yjcOoi i7oY7hi/wR1X5XKe1eSE+LAZyG+9ecX6eb5aeguc5PNncyuonDxJmqlPPV4cUKPE mj00f65VcUP6oNyM5e/TP85U8N+jSd2/zumf9nQD32OnUghNLwFGYOTazKZUjTY4 PyC70/HjDs4zev0EiOrsxPo4HKUL1xnTtJHuQWlKJDjq8df4UE9F8XL2NcC1SSAv 7DaKeKbc5Zxm94Zo2TJTtXflXJYdMuNleubsEYo6Dje4HmMOBeWPwUt167QTrVhm qtMPmxB52AiY5HvMNgnUu62K6lVKzgRDy1nH8PMwfPlaUz2IL8xJlWWN7AuYcCXo wQKtbTtCfA== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDwzCCAqugAwIBAgIEDhE6GTANBgkqhkiG9w0BAQsFADBVMQ4wDAYDVQQDDAVN eSBDQTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yNDA2MjIwOTMyNTJaFw0yNTA2 MjIwOTMyNTJaMIGcMQswCQYDVQQGEwJVUzEOMAwGA1UECAwFU3RhdGUxDTALBgNV BAcMBENpdHkxFTATBgNVBAoMDE9yZ2FuaXphdGlvbjEcMBoGA1UECwwTT3JnYW5p emF0aW9uYWwgVW5pdDEXMBUGA1UEAwwOaW50ZXJtZWRpYXRlQ0ExIDAeBgkqhkiG 9w0BCQEWEWVtYWlsQGV4YW1wbGUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEAr4ZLkUn25bRoyh4pOyfEWJI34hfa4oMEJAyLkdljekEURMN5wk12 KH3nckqaoXl51s3jaExvrqkkfOydg7P6tP5xiaQI96j9G+8KsFVcn6WcHIghIQbs RyjVieZpZWscKVrYWIxMQnfX0pIlTAWzS/S24qv19g1zBgzuGpsUMQUgcLe9Qepu +YLHHAUpWfpaKztrNuBST3tNXnWQO2Kcj5zwAwFYP4GPg5ka7dv9BPT5gT0YVc51 iPpspXwisE3Zy2S3IpvH3q4AZWQPb1/Oh7jKED1aceevUKysWtNRF5ic9yD1LF/M zl1ZIngzmQpPJrjKYi8qwPi5qN2ZU/LLSQIDAQABo1MwUTAdBgNVHQ4EFgQUkn35 fx64ludckSCrrkhFma9TKRQwHwYDVR0jBBgwFoAUu9zlf1GvYr906Fu0/JfyfIel 8XAwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAgWL0FeW85J/D 190YTX1ZjFV2T2YRhy9Q3cdbqJllgL4ejjP5ihQvp/+1yGDS+mJ4iPXa435VmQAM r+drL5vn8f+1b9dnMKL56ReE/uVkPIw6uI5+L+6IxwAb2tROH4ZFFO9L57nCXAXe 2F5MVWMJLBkhETk8Y/HsSZ1dREn/ukBUhrt8NMYXUeWLw7+URW3hK2jI8lN0hKx+ rN+T6ZesidS+XsUDIO2OLdHrYyu7amm5j/vzQxvmceHShZVTC25xPKBaNyviBUzZ 6XoyZMQ9MlCUmMDls8ev1ec0OHKLBDc+LN5/CvgDuW3DS1ffpUf9zoC4qZbHkroG qP2eCOA24g== -----END CERTIFICATE-----
上述阶段是必要的,以捆绑您生成的所有中间证书。在签名验证期间,捆绑起着至关重要的作用。客户端希望尽可能多地获取信息,如果信任将被建立。
// set $untrusted_certificates_filename. This is needed to verify the sender's signature. $gobuy->setUntrustedCertificatesFilename( "path/to/concatenated_cert.pem" );
$gobuy->createCertChain(sprintf( "%sapp/CMS/concatenated_cert.pem", $root ), sprintf( "%sCA/ca.crt", $root ), sprintf( "%sapp/Output/chain.pem", $root ) );
记住:在OpenSSL和证书的上下文中,“捆绑”一词可以指根据具体上下文和使用情况的不同而具有不同类型的证书集合。下面是一个详细的解释
证书捆绑包类型
-
级联中间证书
- 这指的是从由根CA证书签发的第一个中间证书到最后的中间证书形成的一系列中间证书(
concatenated_cert.pem
)。不包含“叶”证书,即:intermediate1.pem + intermediate2.pem + intermediate3.pem ...
。在此捆绑包中不包括终端实体证书,除非在Nginx配置中,对于ssl_certificate
,您可以将终端实体和现有的中间证书捆绑包连接起来:cat server_certificate.crt intermediate_bundle.crt > chain.crt
。 - 通常用于您想要呈现信任链但又不包括根CA(通常已由接收方信任)的场景。
- 这指的是从由根CA证书签发的第一个中间证书到最后的中间证书形成的一系列中间证书(
-
证书链
- 这包括级联的中间证书和根CA证书。
- 完整的链通常用于需要确保呈现完整的信任链,包括根CA的场景,特别是当根CA可能没有预先安装或默认信任时。
使用场景
仅级联中间证书
-
Web服务器(例如,Apache,Nginx)
- 当配置Web服务器时,您通常提供服务器(终端实体)证书以及捆绑包中的中间证书。根CA不包括在内,因为浏览器和操作系统已经有一个受信任的根CA证书存储库。
- 示例
SSLCertificateFile /path/to/your_server_certificate.crt SSLCertificateChainFile /path/to/your_intermediate_certificates_bundle.crt
-
客户端证书认证
- 在某些客户端认证设置中,只需要中间证书来验证客户端证书,假设根CA已被服务器信任。
证书链(包括根CA)
-
电子邮件(S/MIME)
- 在发送带有S/MIME签名的电子邮件时,包括完整的链(中间证书+根证书)可以确保接收方的电子邮件客户端可以验证整个信任链,特别是如果根CA尚未被信任。
-
移动设备和嵌入式系统
- 这些设备可能没有安装完整的受信任根证书集。包括完整的链可以确保证书可以在不依赖于设备现有信任存储的情况下进行验证。
-
某些系统上的证书安装
- 某些系统,特别是较老或不太常见的系统,可能需要在安装或验证过程中呈现完整的链,包括根CA。
总结
- 级联中间证书:当假设根CA已信任时使用,例如在Web服务器配置中。
- 证书链(包括根CA):当需要呈现完整的信任链时使用,例如在电子邮件通信、移动设备以及根CA可能没有预先安装或默认信任的某些特定系统中。
通过理解这些区别和用法场景,您可以在您的应用程序和系统中确保证书捆绑包的正确处理和呈现。
可选
以下为可选。您可以在签名数据之前设置它们
$gobuy->setCMSFlag( OPENSSL_CMS_BINARY ); $gobuy->setCMSEncoding( OPENSSL_ENCODING_SMIME ); $gobuy->setHeader([ "From" => "sender@example.com", "To" => "recipient@example.com", "Subject" => "Signed Data" ]);
加密文件
// Set the output filename where the CMS signed data will be saved $gobuy->setCMSOutputFilename($root."app/path/to/store/signed_data.cms"); // Here you must have invoked the setters like above if ( $gobuy->cmsSign( $endEntityCert ) ) { // This scope means a digital signature was established successfully. $data = $gobuy->getCMSSigned(); // Get signed certificate data; // Preparing for encryption // Set the output filename where the CMS. encrypted data will be saved $gobuy->setCMSEncryptedOutput( $root."app/path/to/encrypted_data.cms" ); // Set the path to recipient's certificate. $gobuy->setRecipientCertPath( $root."app/path/to/recievers/certificate.pem" ); // Optional $gobuy->setCMSCipherAlgo( OPENSSL_CIPHER_AES_128_CBC ); // Encrypt the signed data using CMS. if ($gobuy->cmsEncrypt($root."path/to/signed_data.cms") ) { $gobuy->output( $gobuy->getCMSEncrypted(), "Original" ); } } else { throw new \Exception( "Signing failed: " . openssl_error_string() ); }
签名数据看起来像下面这样。此签名仍然可以从主消息中分离出来,使它们保持独立。
MIME-Version: 1.0 Content-Disposition: attachment; filename="smime.p7m" Content-Type: application/pkcs7-mime; smime-type=signed-data; name="smime.p7m" Content-Transfer-Encoding: base64 MIISsQYJKoZIhvcNAQcCoIISojCCEp4CAQExDTALBglghkgBZQMEAgEwDwYJKoZI hvcNAQcBoAIEAKCCD70wggPDMIICq6ADAgECAgR5nsLKMA0GCSqGSIb3DQEBCwUA MFUxDjAMBgNVBAMMBU15IENBMQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1T dGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMB4XDTI0MDcx MzE2NTExMVoXDTI1MDcxMzE2NTExMVowgZwxCzAJBgNVBAYTAlVTMQ4wDAYDVQQI DAVTdGF0ZTENMAsGA1UEBwwEQ2l0eTEVMBMGA1UECgwMT3JnYW5pemF0aW9uMRww GgYDVQQLDBNPcmdhbml6YXRpb25hbCBVbml0MRcwFQYDVQQDDA5pbnRlcm1lZGlh dGVDQTEgMB4GCSqGSIb3DQEJARYRZW1haWxAZXhhbXBsZS5jb20wggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQC2a8s1ckl1dt5lygY50fMYQMArwpWsjdxv RAbq1JtoHTo9Elc9Bcf4RpSmna3UFlYY8DmQHVPiL6h0OZ9QkxoFQMdJDes/O3rW kPvrZNJWrF/JGCAeukHUXJ6duWkMnmfXW+4fsnO4Z4tscbug6++B5CSzVi9I+/QD knCEt/JTTLPEUtd+nMtYBUStHcEgDxMhajvbAvy364TrD6l4uZ3lEuE8iIeQYMeq rYJJEwgb/DLNktiz1MrG/JP+6REDV+UOib7dRimaiFqNBiUNJQnyaQInTNPQ2nH+ ....
标题用于定义消息应该如何被电子邮件客户端和其他可以读取S/MIME(安全/多用途互联网邮件扩展)消息的软件处理、解释和处理。
1. MIME-Version: 1.0
- 目的:这表示消息是根据MIME标准(版本1.0)格式化的。MIME(多用途互联网邮件扩展)是一种标准,允许在电子邮件中包含各种内容类型,如文本、图像和其他媒体类型。
2. Content-Disposition: attachment; filename="smime.p7m"
- 目的:此标题建议如何向用户呈现内容。
attachment
表示内容应作为可下载的文件呈现,而不是在电子邮件正文中内联。filename="smime.p7m"
表示文件附件的名称,通常用于S/MIME加密消息。
3. Content-Type: application/pkcs7-mime; smime-type=enveloped-data; name="smime.p7m"
- 目的:此标题指定内容的MIME类型。
application/pkcs7-mime
表示内容是 PKCS #7 MIME,它用于 S/MIME 消息。smime-type=enveloped-data
指定消息是加密的(封装数据)而不是签名或包含其他 S/MIME 数据类型。name="smime.p7m"
是另一种方式来指示与此 MIME 部分关联的文件名。
4. Content-Transfer-Encoding: base64
- 目的:此标题指定用于在文本处理协议(如用于电子邮件的简单邮件传输协议 SMTP)上安全传输二进制内容的编码。
base64
表示加密消息的二进制内容已使用 base64 编码,这确保它在传输过程中保持完整。
组合所有内容
这些标题共同确保
- 消息被电子邮件客户端识别为 MIME 消息。
- 内容被视为附件并以指定的文件名保存。
- 电子邮件客户端知道附件是加密的 S/MIME 消息。
- 电子邮件客户端在处理之前将 base64 内容解码回原始二进制形式。
S/MIME 中的用法
S/MIME 使用这些标题通过允许消息加密、签名或两者兼而有之来简化安全电子邮件通信。加密消息确保机密性,意味着只有预期的收件人可以解密并读取消息。当与签名结合使用时,它还提供身份验证和完整性,确保消息未被篡改并验证发件人的身份。
总之,这些标题对于确保 S/MIME 加密消息的正确处理至关重要,为电子邮件客户端提供如何处理和显示消息内容的明确说明。
填充
我们将轻松地填充您的加密数据。此阶段强烈建议您使用它以获得更复杂的结构和随机性。这是为了使加密数据更难以暴力破解,以及其他利用加密文本简单性的攻击。
$padded = $gobuy->paddCMSEncrypted( $strongKey ); // Pad the encrypted data before sending (recommended)
@inject('gobuy', 'App\Services\GoBuy') // Blade @php $gobuy->unPadCMSEncrypted( $padded, $strongKey ); // unpad the padded encrypted data before the decryption stage. @endphp
GoBuy 服务类如下
<?php namespace App\Services; use GoBuy\Encryption\GoBuyEncryption; class GoBuy extends GoBuyEncryption{ }
建议在文件发送之前压缩文件。这将减小文件大小并防止由于文件过大而导致的任何延迟。如果您认为您正在处理一个小文件,您可能希望跳过此阶段的加密。以下展示了我们如何在加密后轻松压缩文件。
// Begin the compression process and create a new ZIP file named "comp.zip". $gobuy->compressData("comp.zip") ->thenAddFileFromString("index.txt", "echo 'Hello, world!' ") // Add a file from a string with the name "index.php" containing a simple PHP echo statement. ->thenAttach("comp.zip", "pic/dog.jpg")// Attach an image file "dog.jpg" from the "pic" directory to the ZIP archive. ->thenAttach("comp.zip", "pic/car.png") // Attach another image file "car.png" from the "pic" directory to the ZIP archive. ->thenAttach("comp.zip", "docs/doc.pdf") // Attach a PDF document "doc.pdf" from the "docs" directory to the ZIP archive. ->thenAfterCloseZip(); // Finalize the ZIP archive and close it.
以上只是一个示例。您不必首先这样做。现在您可以按照以下步骤进行
// Begin the compression process and create a new ZIP file named "comp.zip". $gobuy->compressData("encryption.zip") // Attach an image file "dog.jpg" from the "pic" directory to the ZIP archive. ->thenAttach("encryption.zip", $root."app/encrypted/encrypted_data.cms") // Finalize the ZIP archive and close it. ->thenAfterCloseZip();
接收者
这是接收端,现在将解密文件。
// Continuation from above. Ensure to have called all relevant setters here. $gobuy->setRecipientPrivateKey( $root."app/CMS/private_key.pem", "12345" ); // Password-protected // Set the output filename where the decrypted data will be saved $gobuy->setDecryptedData($root."app/path/to/decrypted_data.cms"); // Decrypt the CMS encrypted data $gobuy->cmsDecrypt($root."app/path/to/encrypted_data.cms"); $gobuy->getDecryptedDataRaw(); // Get the decrypted data.
对于 Laravel 用户,客户端可能看起来像下面这样。现在记住,在某些情况下,客户端是发件人。服务器接收并解密,验证用户等。
<body class="antialiased"> @inject('gobuy', 'App\Services\GoBuy') @php $gobuy->setRecipientCertPath( $gobuy->getRoot()."app/bob_cred/certificate.crt" ); $gobuy->setRecipientPrivateKey( $gobuy->getRoot()."app/bob_cred/private_key.key", "12345" ); $gobuy->setDecryptedData( $gobuy->getRoot()."app/data/decrypted_data.cms" ); $gobuy->cmsDecrypt($gobuy->getRoot()."app/data/encrypted_data.cms"); //echo $gobuy->getDecryptedDataRaw(); // Get the decrypted data. // Here is where the CA certificate is added to the caInfo array. $gobuy->caInfo = [ 'file' => $root.'path/t/hashed/b8218ee6c6064ec03d4129cf4d72f12ab3f07c3b5dccdf0f1e019ae02297bc18.0', // CA certificate file name 'dir' => 'path/to/hashed/CA/certificate/files/' // Path to a directory containing the CA certificates specified as "file" in this array above ]; // set $flag = PKCS7_NOVERIFY to skip CA verification otherwise set it to 0. Integer value. if ($gobuy->cmsVerify ( $gobuy->getDecryptedData(), $gobuy->getRoot()."app/where/to/store/cms_content_data.pem", // Where the original message will be stored after it is detached from the signature. $gobuy->getRoot()."app/where/to/store/cms_signature_data.pem", $flag ) ) // Where the signature is stored after it is ditached from the original message. { $gobuy->output( "CMS VERIfied", "Verified!!" ); } else { $gobuy->output( "CMS Not VERIfied ". openssl_error_string(), "Not Verified!!" ); $gobuy->showAnyError(); } @endphp </body>
记住:包含 CA 证书的目录不总是需要像上面的 $gobuy->caInfo
那样进行哈希。但是,使用哈希目录结构可以优化查找和验证过程,尤其是在处理大量 CA 证书时。有特定的方式对这些文件进行哈希,所以我们建议采用这些方法或使用我们提供的 hashCa
API。
$gobuy->hashCA( $root."path/to/CA/", $root."path/to/save/hashed/CA/" );
以上返回了一个包含哈希 CA 的数组,其原始文件名作为键。
$gobuy->caInfo = $gobuy->prepareCAInfo( $root.'app/path/to/CA' ); // Generate array of the CA certificate and the dir name. $gobuy->caInfo = $gobuy->prepareCAInfoFromHashed( $root.'path/to/hashed/CA' ); // Generate array of the hashed CA certificate and the dir name from the hashed directory
您可以使用我们的 API 帮助轻松准备您的 caInfo。除非您有自己的方法。请勿直接将 CA 证书的内容添加到 ca_info
数组中。这通常会导致失败。
// public function cmsVerify( string $decryptedData, string $output, // string|null $sigfile = null, // array $caInfo = [], // string|null $untrustedCertificatesFilename = null, // string|null $content = null, // string|null $pk7 = null, // int $encoding = OPENSSL_ENCODING_SMIME ): bool | int {
cmsVerify
的第二个参数显示签名签名之前的内容(可读消息),即签名分离之后。第三个参数是包含分离签名的文件。
您可以将加密数据通过 Laravel 的视图方法如下推送
return view('welcome', [ "encrypted" => $gobuy->getCMSEncrypted() ]);
//Blade {{ $encrypted }}
使用 PKCS7 系统
// Set the input filename for the data to be signed using PKCS7 $gobuy->setInputFilename("path/to/data.txt"); // Holds just plain text. // Set the output filename where the PKCS7 signed data will be saved $gobuy->setPKCS7SignedOutputFilename("./path/to/pkcs7_signed_data.cms"); // Set the path to the sender's certificate for PKCS7 signing $gobuy->setSenderCertPath("path/to/sender/certificate.pem"); // Set the path to the sender's private key for PKCS7 signing $gobuy->setSenderPrivateKeyPath("path/to/sender/private_key.pem"); // Optional: Set email headers for the S/MIME message for PKCS7 $gobuy->setHeader([ "From" => "sender@example.com", "To" => "recipient@example.com", "Subject" => "Signed Data" ]); // Sign the data using PKCS7 if ($gobuy->pkcs7Sign( $endEntityCert )) { // Set the output filename where the PKCS7 encrypted data will be saved $gobuy->setPKCS7EncryptedOutputFilename("./path/to/pkcs7_encrypted_data.cms"); // Set the path to the recipient's certificate for PKCS7 encryption $gobuy->setRecipientCertPath("path/to/recipient/certificate.pem"); // Generate recipient credentials for PKCS7 encryption // $gobuy->generateRecipientCredentials(); // Encrypt the signed data using PKCS7 if ($gobuy->pkcs7Encrypt()) { // Rest of your code $encrypted = $gobuy->getPKCS7EncryptedOutput(); // Get contents of encrypted outputfile. } }
与上面相同
@php // Set the output filename where the PKCS7 decrypted data will be saved $gobuy->setPKCS7DecryptedOutputFilename("./path/to/pkcs7_decrypted_data.cms"); // Set the path to the recipient's certificate for PKCS7 decryption $gobuy->setRecipientCertPath("path/to/recipient/certificate.pem"); // Set the path to the recipient's private key for PKCS7 decryption $gobuy->setRecipientPrivateKey("path/to/recipient/private_key.pem"); // Decrypt the PKCS7 encrypted data if ($gobuy->pkcs7Decrypt($gobuy->getPKCS7EncryptedOutputFilename())) { // Set the output filename where the PKCS7 original message will be saved $gobuy->setPKCS7RawDataOutput( "./path/to/data_pkcs7_content.txt" ); // Set the path where the detached signature will be saved. $gobuy->setPKCS7SignatureOutput( "./path/to/data_pkcs7_signature.pem" ); $gobuy->caInfo = [ "file" => "path/to/ca.crt", "dir" => "path/to/CA/dir" ]; // Verify the PKCS7 decrypted data $gobuy->pkcs7Verify($gobuy->getPKCS7DecryptedOutputFilename()); } @endphp
注意我们如何重新分配了$gobuy->caInfo
。在大多数情况下,尝试使用散列目录可能会导致错误。在使用pkcs7Verify
进行验证时,请指定原始CA证书。
替代证书生成
在你正在使用的类上下文中,generateRecipientCredentials()
和generateSenderCredentials()
方法可以设计用来简化证书生成过程。当调用这些方法时,它们可以在内部为接收者和发送者分别创建一个证书和私钥。如果你更喜欢不手动在文件系统中创建和管理证书文件和私钥文件,这个特性尤其有用。
以下是如何调用这些方法的示例
... list( $senderRawCert, $senderPrivateKey ) = $gobuy->generateSenderCredentials( $config, $dn, $expiresIn );
在大多数情况下,接收者是服务器,它将解密和验证用户数据。
@php list( $recipientRawCert, $recipientPrivateKey ) = $gobuy->generateRecipientCredentials( $config, $dn, $expiresIn ); @endphp
//Where $config = array( "digest_alg" => "sha512", // Digest algorithm for the certificate signature "private_key_bits" => 4096, // Number of bits for the private key "private_key_type" => OPENSSL_KEYTYPE_RSA, // Type of private key to create ) $dn = array( "countryName" => "AU", // Country name "stateOrProvinceName" => "...", // State or province name "localityName" => "...", // Locality name "organizationName" => "...", // Organization name "organizationalUnitName" => "...", // Organizational unit name "commonName" => "www.", // Common name, usually the domain name "emailAddress" => "..." // Email address ), $expiresIn = 365
在使用这些方法时,你不需要担心文件路径或直接处理证书文件。该方法负责生成必要的证书和私钥,并在后续的加密操作中使用它们。这使得过程更加流畅且用户友好,特别是对于那些可能不熟悉证书和密钥管理细节的人。
这些方法被设计为灵活的,允许你指定发送者和接收者的不同配置和区分名称。$config
数组允许你定义证书和私钥生成的加密参数,而$dn
数组包含将包含在证书主题字段中的信息。$expiresIn
参数设置了证书的有效期限(以天为单位)。这些方法抽象了生成和管理加密证书的复杂性,使得在应用程序中实现安全通信更加容易。
为了快速进行CMS加密,请考虑以下内容
$encrypted = $gobuy->encryptCMS( "path/to/data.txt", "path/to/save/encrypted_data.cms", "path/to/save/user_certificate.pem" );
以上内容可用于多种编码数据,包括证书和密钥。与cmsEncrypt
(S/MIME)对应物相比,它更通用且结构更简单。
$same = $gobuy->checkIfCertKeyMatch( "path/to/certificate.pem", "path/to/private_key.pem" );
检查证书和密钥文件是否对应同一实体。你可以使用上述API进行验证。如果是匹配的,则返回true
,否则返回false
。
这些为您提供了便利
$gobuy->viewCertificate( sprintf( "%sapp/Output/root_cert.pem", $root ) );
以上内容将返回类似以下内容:
Certificate: Data: Version: 3 (0x2) Serial Number: 3b:49:c4:c9:f6:b2:4b:96:7e:aa:88:ac:13:ed:09:40:10:91:f3:5a Signature Algorithm: sha256WithRSAEncryption Issuer: C=DE, ST=Hessen, L=Frankfurt, O=GoBuy, OU=Tech Team, CN=www.gobuy.cheap, emailAddress=info@gobuy.cheap Validity Not Before: Jul 16 13:39:05 2024 GMT Not After : Jul 16 13:39:05 2025 GMT Subject: C=DE, ST=Hessen, L=Frankfurt, O=GoBuy, OU=Tech Team, CN=www.gobuy.cheap, emailAddress=info@gobuy.cheap Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (2048 bit) Modulus: 00:c1:a4:af:05:4b:42:0a:fd:59:32:bc:07:7e:2c: aa:5a:85:c4:c7:aa:f5:57:bf:db:40:60:db:f9:7c: 19:df:37:e0:37:5d:91:d2:f6:1a:75:f3:ed:57:07: f8:25:c9:e1:af:96:20:c0:d6:9a:e2:65:84:63:53: 9b:ca:de:7b:c1:49:7b:e2:63:9c:cb:43:8b:59:95: 4f:f2:23:2c:52:7a:84:d2:cf:e8:67:4c:4a:76:25: 2c:16:79:47:30:18:11:68:e1:6a:b5:2e:49:35:33: f1:f5:24:0c:36:d2:ae:5e:9f:e1:d8:81:0b:7a:61: 26:f6:46:66:84:85:19:f7:cf:8f:3d:30:3f:86:64: a1:9f:46:e0:6f:db:50:90:13:7b:d5:d5:7d:0a:28: 38:97:29:08:20:95:00:38:54:b4:08:c1:62:1a:bf: 28:8a:b9:3a:fe:b9:97:e9:ae:3b:f2:1d:89:fc:6a: 50:93:9b:1a:7e:07:5d:31:a8:bf:af:8c:28:a2:ce: 0e:6d:97:61:e5:42:13:33:ad:19:27:c1:ce:51:a8: ec:3d:1b:07:c3:f2:18:40:cc:6a:12:3b:7e:69:d4: 6d:1a:e3:a4:a0:53:d2:3a:c8:7c:92:59:3b:72:67: f8:83:c6:73:cb:9b:68:a2:6d:8f:b3:09:8e:b1:0b: 80:25 Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Subject Alternative Name: DNS:example.com, DNS:www.example.com X509v3 Subject Key Identifier: A4:BC:EE:31:90:A4:B0:A7:D0:5F:B9:C6:DA:47:A8:70:2A:01:1C:0D Signature Algorithm: sha256WithRSAEncryption Signature Value: a3:ea:fa:29:cc:75:0a:e3:c6:6b:1b:a2:22:67:f4:8e:b4:56: 70:f6:d3:24:7f:7e:21:eb:01:d8:8f:de:39:61:8e:8e:d5:c4: 4c:6a:8c:d1:d5:4f:c5:3a:ca:6e:ac:64:c5:29:c7:66:96:63: df:14:ba:c7:3d:9a:c9:87:d9:fd:7e:44:30:f6:fb:2a:ef:d7: f9:98:a0:94:3c:50:47:df:af:85:f4:24:75:e6:2f:4a:91:ae: c2:31:c6:dc:db:52:9a:3c:51:49:c4:68:2b:6c:79:30:6e:f0: a4:5b:ec:a3:48:82:fd:57:5e:9e:48:02:e6:61:8b:69:4e:03: 69:ae:1f:3c:76:2a:15:90:4c:83:af:f2:b1:65:de:ef:f6:d4: 5b:0e:3f:5e:66:f5:79:ca:bf:b0:9f:a8:f6:55:e7:77:8a:cb: fa:62:cc:96:fe:9a:77:02:8f:61:5b:28:da:01:41:de:ce:88: 1a:92:c5:e0:4d:13:5b:44:52:88:79:35:b8:fd:e2:78:c9:b0: 7d:6a:96:7f:3d:67:d0:f7:38:03:08:3d:20:98:0c:4c:8b:da: 1b:a3:cf:83:18:2e:b1:94:18:dc:f1:2d:ed:1e:dd:36:3e:ec: 73:da:c2:2a:76:d4:a1:18:d7:79:d4:6f:e0:f0:31:8a:ea:85: ff:8a:25:60
$gobuy->convertPEMtoDER( sprintf( "%sapp/Output/root_cert.pem", $root ), sprintf( "%sapp/Output/root_cert_der.der", $root ) );
将PEM转换为DER。
$gobuy->convertDERtoPEM( sprintf( "%sapp/Output/root_cert_der.der", $root ), sprintf( "%sapp/Output/root_cert_pem.pem", $root ) );
将DER转换为PEM。
echo $gobuy->verifyCertWithCA( sprintf( "%sCA/ca.crt", $root ), sprintf( "%sapp/CMS/concatenated_cert.pem", $root ) );
如果返回“OK”,则返回以下内容,否则抛出错误。其中concatenated_cert.pem
是包含从API cascadeUntrustedCertificate生成的级联中间文件的文件。我们建议你尝试使用此API,并查看哪些证书与指定的CA证书不匹配。我们希望这会使操作更简单。你也可以使用我们的API生成所需的证书。
C:\xampp\htdocs\...\app/CMS/concatenated_cert.pem: OK
$gobuy->encryptFile(sprintf( "%sapp/Output/data.txt", $root ), sprintf( "%sapp/Output/encr_data.pem", $root ), 'password');
加密数据。返回文件内容
$gobuy->decryptFile(sprintf( "%sapp/Output/encr_data.pem", $root ), sprintf( "%sapp/Output/decr_data.pem", $root ), 'password');
解密数据。返回文件内容
echo $gobuy->createPKCS12(sprintf( "%sapp/CMS/user_certificate.pem", $root ), sprintf( "%sapp/CMS/user_private_key.pem", $root ), sprintf( "%sCA/ca.crt", $root ), sprintf( "%sapp/Output/p12_cert.p12", $root ), "password" );
创建PKCS12文件。CA/ca.crt
是CA证书文件。这是可选的,但通常包括在内,以完成信任链。
$gobuy->extractCertFromPKCS12(sprintf( "%sapp/Output/p12_cert.p12", $root ), sprintf( "%sapp/Output/extracted_cert_from_pkcs12.pem", $root ), "password" );
你应该得到类似以下内容的输出
Bag Attributes localKeyID: 5E 35 0F B6 83 B5 D4 6D E6 88 2B 6B BD 88 80 FF FF 61 8B 49 subject=C=DD, ST=EE, L=RR, O=DD, OU=SS, CN=TT, emailAddress=DD issuer=C=DD, ST=EE, L=RR, O=DD, OU=SS, CN=TT, emailAddress=DD -----BEGIN CERTIFICATE----- MIIDozCCAougAwIBAgIUb+GFUKMJXObxtUV8K5PqJ7RQB90wDQYJKoZIhvcNAQEL BQAwYTELMAkGA1UEBhMCREQxCzAJBgNVBAgMAkVFMQswCQYDVQQHDAJSUjELMAkG A1UECgwCREQxCzAJBgNVBAsMAlNTMQswCQYDVQQDDAJUVDERMA8GCSqGSIb3DQEJ ARYCREQwHhcNMjQwNzE1MTgzMjQ5WhcNMjUwNzE1MTgzMjQ5WjBhMQswCQYDVQQG EwJERDELMAkGA1UECAwCRUUxCzAJBgNVBAcMAlJSMQswCQYDVQQKDAJERDELMAkG A1UECwwCU1MxCzAJBgNVBAMMAlRUMREwDwYJKoZIhvcNAQkBFgJERDCCASIwDQYJ KoZIhvcNAQEBBQADggEPADCCAQoCggEBAO88NIOcEhxTsIfRIJm44w7L+4yEo5wS iMY5e7KyTSQTthZIZfN1hehSP7nAzzFMkmSzQIimouN9dOdpW7QSRnxtslBMtG2O s28q6WM0O1YipRMQaoaZlF7oi7BqSSqcxO8HmdGOIK0TYZCkFpFQo31+7u2dgyE6 ... -----END CERTIFICATE----- Bag Attributes: <No Attributes> subject=CN=My CA, C=AU, ST=Some-State, O=Internet Widgits Pty Ltd issuer=CN=My CA, C=AU, ST=Some-State, O=Internet Widgits Pty Ltd -----BEGIN CERTIFICATE----- MIIDeDCCAmCgAwIBAgIBADANBgkqhkiG9w0BAQsFADBVMQ4wDAYDVQQDDAVNeSBD QTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGElu dGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yNDA3MTYxOTAzMzZaFw0yNTA3MTYx OTAzMzZaMFUxDjAMBgNVBAMMBU15IENBMQswCQYDVQQGEwJBVTETMBEGA1UECAwK U29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIB IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuXLTFqGOZCz+kMcJd/ctpmGn mmUJkOLacaB20u7UiNgJ7LWOsxDgtSX0Kozusu0ZX5CBk/0wEXV40HoUaRalsY9+ rrbu+EU17obzInVRcp5xBI+BcuSnngRpaH+LIOONJDVD8jVAj8+h6voEIpssDcvh ... -----END CERTIFICATE-----
echo $gobuy->extractKeyFromPKCS12(sprintf( "%sapp/Output/p12_cert.p12", $root ), sprintf( "%sapp/Output/extracted_key_from_pkcs12.pem", $root ), "12345" );
Bag Attributes localKeyID: 5E 35 0F B6 83 B5 D4 6D E6 88 2B 6B BD 88 80 FF FF 61 8B 49 Key Attributes: <No Attributes> -----BEGIN ENCRYPTED PRIVATE KEY----- MIIFNTBfBgkqhkiG9w0BBQ0wUjAxBgkqhkiG9w0BBQwwJAQQxGMCE0aNJBO9Yjsn aCuF4AICCAAwDAYIKoZIhvcNAgkFADAdBglghkgBZQMEASoEEJc3wEJNlTW+gYbt .... -----END ENCRYPTED PRIVATE KEY-----
解释
- 包属性提供关于密钥和证书的元数据。
- localKeyID唯一标识PKCS#12文件内的密钥。
- 密钥属性可能包含附加的元数据或为空。
- 加密私钥部分包含实际的密钥数据,以加密格式。
$serialCreated = $gobuy->serialFileCreated( sprintf( "%sCA/", $root ), "serial.srl"); if ( $serialCreated ) { $gobuy->signCSRWithCA(sprintf( "%sapp/CMS/csr.pem", $root ), sprintf( "%sCA/ca.crt", $root ), sprintf( "%sCA/ca.key", $root ), sprintf( "%sapp/Output/new_server_cert.pem", $root ), 365, sprintf( "%sCA/serial.srl", $root )); }
使用以上内容,你可以轻松创建一个新PEM证书,并使用你需要指定的CA证书进行签名。如果你没有上述所有CA证书,请扩展我们的包在供应商www.gobuy.cheap
中,并找到我们为你留下的CA
文件夹。我们希望这会使操作更简单。你也可以使用我们的API生成所需的证书。
echo $gobuy->checkPrivateKey( sprintf( "%sapp/Output/private_key.pem", $root ) );
检查私钥是否正常。
RSA key ok -----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDBpK8FS0IK/Vky vAd+LKpahcTHqvVXv9tAYNv5fBnfN+A3XZHS9hp18+1XB/glyeGvliDA1priZYRj U5vK3nvBSXviY5zLQ4tZlU/yIyxSeoTSz+hnTEp2JSwWeUcwGBFo4Wq1Lkk1M/H1 JAw20q5en+HYgQt6YSb2RmaEhRn3z489MD+GZKGfRuBv21CQE3vV1X0KKDiXKQgg lQA4VLQIwWIavyiKuTr+uZfprjvyHYn8alCTmxp+B10xqL+vjCiizg5tl2HlQhMz rRknwc5RqOw9GwfD8hhAzGoSO35p1G0a46SgU9I6yHySWTtyZ/iDxnPLm2iibY+z CY6xC4AlAgMBAAECggEAPh94KsmfEWl/0T/zY24u5MWfgLL+7LzXOQsZ5ysCHdOO MhTpsHVVvduYm+Apou3mYm9WaKcwn0sUMs1i4K2JpFPP06xDZA5ySTYWpMbV9Evs Crm6hFE8XjTEtR0JUouWIkCW/DMyN0hH6m4EHIHghq1gtK5BDHU1GGW524ulEpcZ7AoGAXHlEy6W7sjtdrA7KvP6S o20E1+eHs1VUupEftr+DhNegnqaT8E9ZIkvcp40N9A3+TyQNvOu+244kugnKWh/K nUv3MVXcLQ6+PcATV0EdGcvFZnYA5JBH6fnb1IZRFOUJz7aWnF/i3Em1kieDwTuq /ftE92dTEmze2b3yX16y8F8= -----END PRIVATE KEY-----
echo $gobuy->checkCSR( sprintf( "%sapp/CMS/csr.pem", $root ) );
获取关于你的CSR文件的信息。输出将类似于以下内容
Certificate Request: Data: Version: 1 (0x0) Subject: C=DE, ST=EFF, L=SSS, O=AAA, OU=DD, CN=FFF, emailAddress=WEE Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (2048 bit) Modulus: 00:a3:a9:4d:4c:31:41:51:9a:39:9e:cb:79:45:25: 02:5d:d2:cc:54:9f:0f:f8:53:b6:96:1f:9f:6f:d6: 73:73:a4:f9:3b:00:4e:a7:18:77:d6:6c:13:47:7d: 81:d2:5e:85:36:82:44:67:bb:c9:a3:49:6d:ea:b2: c9:71:dd:f8:fa:27:5e:8a:d1:b4:4e:fa:d9:d3:89: 1e:7b:77:9f:d7:43:1d:70:bc:a8:b6:be:70:77:c3: db:a8:30:a6:bc:b0:4f:6a:68:f7:5d:87:06:01:7a: dd:22:78:9c:7c:41:a4:03:a9:02:c5:96:d2:bc:43: d1:b8:8e:74:56:4c:9b:42:6b:a6:18:33:ca:02:21: d1:a0:88:a3:6b:c2:7f:01:75:14:f9:63:c1:02:e7: 28:90:37:a1:46:39:0f:f3:74:f3:25:01:b3:0f:2e: f7:d9:ac:7a:f2:b2:64:55:bb:3f:e1:9c:94:b9:76: 0b:40:e1:7f:5b:cd:06:8f:59:ff:85:61:a9:27:aa: 88:d5:ab:06:3f:d6:ee:08:9b:6c:12:18:8e:0b:b6: e7:38:bd:f0:82:55:a1:1a:0f:c6:aa:a9:a6:04:07: d3:23:ec:03:af:72:f8:fa:3f:e3:51:49:eb:d2:ef: 7c:31:79:ed:56:a3:0b:d8:51:e9:02:a7:cc:66:dc: 07:39 Exponent: 65537 (0x10001) Attributes: (none) Requested Extensions: Signature Algorithm: sha256WithRSAEncryption Signature Value: 0a:e9:ec:3f:c4:ba:9e:a0:17:5b:0c:08:4f:fe:96:65:8e:39: a7:2d:20:7b:62:27:89:8f:41:94:5a:ee:bd:37:06:d1:ec:6a: 02:a7:72:52:33:23:87:ef:8e:f0:df:4d:4b:1d:e8:41:8c:08: c6:a1:9b:89:87:56:a0:19:6d:50:19:ce:6b:af:4c:6f:35:f4: 79:2a:6e:88:6b:b8:91:eb:b7:e3:c8:15:43:90:65:1e:13:fa: 15:42:2e:c5:d3:40:a9:ef:a9:16:22:39:89:ad:94:fc:b0:f7: 42:b5:f7:0f:a7:45:f7:7f:33:fa:c0:9d:3b:65:12:7f:fa:a9: 01:6c:29:a9:18:92:09:27:14:64:c9:25:23:88:62:17:2b:5c: d0:c8:ad:3d:b4:6f:71:3e:6a:90:cb:c6:3f:80:1f:97:69:35: fa:9c:2c:de:24:b7:d7:e9:1f:a9:24:45:b4:c1:e0:13:1e:e3: 0c:1e:85:a6:88:8a:33:4d:53:48:5f:0f:2d:c0:03:94:17:d9: 4c:de:79:c9:20:f0:02:59:f9:b6:66:4a:99:ed:83:dd:a9:aa: fb:56:ff:24:3d:32:13:52:4a:59:d7:46:9d:52:19:0b:2e:6e: 41:41:d4:f3:b7:6d:b1:6e:0c:06:c2:94:69:f5:42:77:58:99: 8f:a7:ca:89
echo $gobuy->base64EncodeFile( sprintf( "%sapp/CMS/data.txt", $root ), sprintf( "%sapp/Output/encoded.txt", $root ) );
输出将类似于以下内容
UGxlYXNlIE5vdGU6IFRoaXMgY29udGFjdCBmb3JtIGlzIGZvciBhZHZlcnRpc2Vy cyANCndobyBoYXZlIGEgYnVzaW5lc3MgYWNjb3VudCBhbmQgbmVlZCBoZWxwIHdp dGggQWRzDQogTWFuYWdlci4gVG8gZ2V0IGhlbHAgd2l0aCB0aGUgYXBwLCBvciBh IHBlcnNvbmFsDQogIFNuYXBjaGF0IGFjY291bnQsIHBsZWFzZSByZWFjaCBvdXQg dG8gU25hcGNoYXQgU3VwcG9ydCBoZXJlLg==
Diffie-Hellman
在我们的加密类中,我们坚信在开始解密或从秘密生成用于其他任务的密钥之前,将Diffie-Hellman身份验证阶段作为关键步骤。这个涉及你和你的用户的身份验证过程在确保加密通信的安全性和完整性方面发挥着至关重要的作用。以下是为什么我们认为这是必要的理由
-
相互认证:通过Diffie-Hellman认证阶段,我们便于您与您的用户之间进行相互认证。通过验证彼此的身份,您可以在进行解密过程或从共享密钥生成密钥之前建立信任和信心。这种相互认证有助于防止未经授权的访问并保护免受中间人攻击。请参阅我们关于“加密”的书籍,了解更多关于这种攻击的信息,我们在这里讨论了足够的例子。
-
防止重放攻击:包括Diffie-Hellman认证可以防止重放攻击。有了认证,每个通信会话都会生成一个独特的会话密钥,该密钥仅用于该会话。这防止了重放攻击,即对手拦截并重放之前捕获的加密数据,因为会话密钥会为每个会话而变化。
-
防御冒充攻击:通过整合Diffie-Hellman认证阶段,我们降低了冒充攻击的风险。通过认证过程,您和您的用户都验证了您各自的身份,确保加密和解密操作只在预期的当事人之间进行。这保护了免受试图冒充您或用户的恶意个人。
刀片模板代码
<body class="antialiased"> @inject('gobuy', 'App\Services\GoBuy') @php $base = $gobuy->generateLargeBase(); $prime = $gobuy->generateLargePrime(); $dh = $gobuy->getDH( $prime, $base ); list($privateKey, $publicKey) = $dh->generateClientKeys(); @endphp </body>
解释
-
带有类的HTML正文标签:
<body class="antialiased">
- 这定义了具有用于改进文本渲染的类
antialiased
的HTML文档正文。
- 这定义了具有用于改进文本渲染的类
-
服务注入:
@inject('gobuy', 'App\Services\GoBuy')
- 使用
@inject
指令将GoBuy
服务的实例注入到Blade模板中。这允许在模板中访问该服务的方法。GoBuy
类直接继承自GoBuyEncryption
内部类。这是将我们的对象带到您视野中的方法之一。
- 使用
<?php namespace App\Services; use GoBuy\Encryption\GoBuyEncryption; class GoBuy extends GoBuyEncryption{ }
- PHP块:
@php $base = $gobuy->generateLargeBase(); $prime = $gobuy->generateLargePrime(); $dh = new GoBuy\Encryption\DiffieHellman($base, $prime); list($privateKey, $publicKey) = $dh->generateClientKeys(); @endphp
-
生成大底和大素数:
$base = $gobuy->generateLargeBase(); $prime = $gobuy->generateLargePrime();
- 调用
GoBuy
服务的方法以生成用于Diffie-Hellman密钥交换的大底和大素数。
- 调用
-
初始化Diffie-Hellman:
$dh = $gobuy->getDH($base, $prime);
- 获取一个新实例的
DiffieHellman
类,初始化为生成的底数和素数。
- 获取一个新实例的
-
生成客户端密钥:
list($privateKey, $publicKey) = $dh->generateClientKeys();
- 调用
DiffieHellman
类的generateClientKeys
方法以生成一对客户端密钥(私钥和公钥)。
- 调用
-
此代码在Laravel Blade模板中设置了进行Diffie-Hellman密钥交换所需的必要值和对象,利用自定义的GoBuy
服务和DiffieHellman
加密类。
Diffie-Hellman 密钥交换数据的 HTML Div 元素
此示例演示了一个HTML <div>
元素,用于存储和显示Diffie-Hellman密钥交换数据。该<div>
中的数据属性存储了各种密钥交换值,如公钥、底数、素数和私钥。
HTML 代码
//Blade @php $base = $gobuy->generateLargeBase(); $prime = $gobuy->generateLargePrime(); $dh = new GoBuy\Encryption\DiffieHellman($base, $prime); list($privateKey, $publicKey) = $dh->generateClientKeys(); @endphp <div id="response" public-key-data="{{$publicKey}}" base-data="{{$base}}" prime-data="{{$prime}}" private-key-data="{{$privateKey}}"> </div>
解释
-
公钥数据属性:
public-key-data="{{$publicKey}}"
public-key-data
属性存储了在Diffie-Hellman密钥交换过程中生成的公钥。值{{$publicKey}}
是一个Blade模板表达式,输出公钥值。
-
基数数据属性:
base-data="{{$base}}"
base-data
属性存储了Diffie-Hellman密钥交换中使用的基数。值{{$base}}
是一个Blade模板表达式,输出基数值。
-
素数数据属性:
prime-data="{{$prime}}"
prime-data
属性存储了Diffie-Hellman密钥交换中使用的素数。值{{$prime}}
是一个Blade模板表达式,输出素数值。
-
私钥数据属性:
private-key-data="{{$privateKey}}"
private-key-data
属性存储了在Diffie-Hellman密钥交换过程中生成的私钥。值{{$privateKey}}
是一个Blade模板表达式,输出私钥值。
此 <div>
元素用作存储和显示 Diffie-Hellman 密钥交换数据的容器。通过使用自定义数据属性(public-key-data
、base-data
、prime-data
、private-key-data
),该元素封装了密钥交换过程所需的所有值。Blade 模板表达式({{ $publicKey }}
、{{ $base }}
、{{ $prime }}
、{{ $privateKey }}
)将相应的值动态插入到属性中。还有更多方法提取这些值。现在这取决于您最想使用的方法。
var clientPublicKey = $( "#response" ).attr( "public-key-data" ); var clientPrivateKey = $( "#response" ).attr( "private-key-data" ); var base = $( "#response" ).attr( "base-data" ); var prime = $( "#response" ).attr( "prime-data" ); var obj = { "clientPublicKey" : clientPublicKey, "clientPrivateKey" : clientPrivateKey, "base" : base, "prime" : prime } $.ajax({ url: "/send_client_dets", type: "post", data: obj, success: function ( res ) { console.log( res ) var clientSharedSecret = modExp( res[ "serverPublicKey" ], clientPrivateKey, prime) if ( clientSharedSecret===res[ "seversharedSecret" ] ) { // Use the shared secret here ... } }, error: function ( err ) { if ( err ) console.error( err.responseText ); } })
我们正在使用 jQuery 来加快速度。您可以使用您认为合适的任何方法。
// Function to perform modular exponentiation function modExp(base, exponent, modulus) { // Convert input values to BigInt for handling large integers base = BigInt(base); exponent = BigInt(exponent); modulus = BigInt(modulus); // If modulus is 1, the result is always 0 if (modulus === 1n) return 0n; // Initialize result to 1n (BigInt 1) let result = 1n; // Compute base % modulus base = base % modulus; // Loop while exponent is greater than 0 while (exponent > 0) { // If the current exponent is odd, multiply result by base and take modulus if (exponent % 2n === 1n) { result = (result * base) % modulus; } // Right shift the exponent by 1 (equivalent to dividing by 2) exponent = exponent >> 1n; // Square the base and take modulus base = (base * base) % modulus; } // Return the computed result return result; }
详细说明
-
函数定义:
function modExp(base, exponent, modulus) {
- 定义了一个名为
modExp
的函数,它接受三个参数:base
、exponent
和modulus
。
- 定义了一个名为
-
将输入值转换为 BigInt:
base = BigInt(base); exponent = BigInt(exponent); modulus = BigInt(modulus);
- 将
base
、exponent
和modulus
参数转换为 BigInt 以处理超过常规 JavaScript 数字精度的整数计算。
- 将
-
检查模数是否为 1:
if (modulus === 1n) return 0n;
- 如果
modulus
为1
,则函数立即返回0
,因为任何数字对1
取模都是0
。
- 如果
-
初始化结果:
let result = 1n;
- 初始化变量
result
为1n
(BigInt 1)。它将存储模幂运算的最终结果。
- 初始化变量
-
计算初始基数模数:
base = base % modulus;
- 计算
base % modulus
并使用此值更新base
变量。
- 计算
-
主循环:
while (exponent > 0) {
- 一个循环,只要
exponent
大于0
就继续。
- 一个循环,只要
-
检查指数是否为奇数:
if (exponent % 2n === 1n) { result = (result * base) % modulus; }
- 如果
exponent
是奇数(exponent % 2n === 1n
),则将result
乘以base
,然后取模以更新result
。
- 如果
-
右移指数:
exponent = exponent >> 1n;
- 将
exponent
右移1
,这相当于将exponent
除以2
(使用整数除法)。
- 将
-
平方基数:
base = (base * base) % modulus;
- 将
base
平方然后取模以更新base
。
- 将
-
返回结果:
return result;
- 返回最终计算的
result
。
- 返回最终计算的
此函数 modExp
实现了模幂运算算法,该算法高效地计算 (base^exponent) % modulus
。它使用 BigInt 处理大整数,并使用平方指数法来确保即使对于大指数值,计算也是高效的。
Route::post('/send_client_dets', '\App\Http\Controllers\UserController@sendClientDets');
接下来是针对端点,就像上面的一样或选择不同的 URI。下面是控制器方法
控制器方法
public function sendClientDets(Request $request, GoBuyEncryption $gobuy) { // Retrieve the client's public key from the request $clientPulicKey = $request["clientPublicKey"]; // Retrieve the base value from the request $base = $request["base"]; // Retrieve the prime value from the request $prime = $request["prime"]; // Initialize the Diffie-Hellman object with the base and prime values using the GoBuyEncryption service $dh = $gobuy->getDH($base, $prime); // Generate the server's public and private keys using the Diffie-Hellman object list($serverPublicKey, $serverPrivateKey) = $dh->getServerKeys(); // Compute the shared secret using the client's public key, server's private key, and prime value $sharedSecret = $dh->computeSharedSecret($clientPulicKey, $serverPrivateKey, $prime); // Return an array containing the server's shared secret and public key return [ "seversharedSecret" => $sharedSecret, "serverPublicKey" => $serverPublicKey ]; }
详细说明
-
函数定义:
public function sendClientDets(Request $request, GoBuyEncryption $gobuy)
- 这定义了一个名为
sendClientDets
的公共函数,它接受两个参数:HTTP 请求对象$request
和GoBuyEncryption
服务实例$gobuy
。
- 这定义了一个名为
-
检索客户端公钥:
$clientPulicKey = $request["clientPublicKey"];
- 从请求数据中提取客户端公钥并将其存储在
$clientPublicKey
变量中。
- 从请求数据中提取客户端公钥并将其存储在
-
检索基值:
$base = $request["base"];
- 从请求数据中提取用于 Diffie-Hellman 计算的基值并将其存储在
$base
变量中。
- 从请求数据中提取用于 Diffie-Hellman 计算的基值并将其存储在
-
检索素值:
$prime = $request["prime"];
- 从请求数据中提取用于 Diffie-Hellman 计算的素值并将其存储在
$prime
变量中。
- 从请求数据中提取用于 Diffie-Hellman 计算的素值并将其存储在
-
初始化 Diffie-Hellman 对象:
$dh = $gobuy->getDH($base, $prime);
- 使用
GoBuyEncryption
服务根据提供的基和素值创建一个新的 Diffie-Hellman 对象。
- 使用
-
生成服务器密钥:
list($serverPublicKey, $serverPrivateKey) = $dh->getServerKeys();
- 在 Diffie-Hellman 对象上调用
getServerKeys
方法以生成和检索服务器的公钥和私钥。这些密钥分别存储在$serverPublicKey
和$serverPrivateKey
变量中。
- 在 Diffie-Hellman 对象上调用
-
计算共享密钥:
$sharedSecret = $dh->computeSharedSecret($clientPulicKey, $serverPrivateKey, $prime);
- 使用客户端公钥、服务器私钥和素值计算共享密钥。结果存储在
$sharedSecret
变量中。
- 使用客户端公钥、服务器私钥和素值计算共享密钥。结果存储在
-
返回响应:
return [ "seversharedSecret" => $sharedSecret, "serverPublicKey" => $serverPublicKey ];
- 返回一个包含计算得到的共享密钥(
"seversharedSecret"
)和服务器公钥("serverPublicKey"
)的关联数组。这些数据通常作为响应发送回客户端。
- 返回一个包含计算得到的共享密钥(
此函数执行Diffie-Hellman密钥交换,生成并返回服务器的公钥以及从客户端公钥和服务器私钥派生的共享密钥。
或者在Diffie-Hellman的
您可以在客户端放置一个PHP脚本,使用CMD提示符执行。
php artisan make:command Encryption
<?php namespace App\Console\Commands; use Illuminate\Console\Command; class Encryption extends Command { /** * The name and signature of the console command. * * @var string */ protected $signature = 'exec:encryption'; /** * The console command description. * * @var string */ protected $description = 'Command description'; /** * Execute the console command. */ public function handle() { // Include the external PHP script, "script3.php". Place in public folder where CSS and JS folders normally are. include public_path( "client3.php" ); } }
在client3.php
中包含以下我们的对象。这可以完美工作。
<?php require "../vendor/autoload.php"; use GoBuy\Encryption\GoBuyEncryption; use GoBuy\Encryption\DiffieHellman; $gobuy = new GoBuyEncryption(); $base = $gobuy->generateLargeBase(); $prime = $gobuy->generateLargePrime(); $dh = $gobuy->getDH( $prime, $base ); list($privateKey, $publicKey) = $dh->generateClientKeys( ); // We need a public key from the server if secret MUST be derived. $serverUrl = 'http://127.0.0.1:8000'; $queryBuilder = [ "prime"=>$prime, "base" => $base]; $serverPublicKey = $dh->getServerPublicKey( $serverUrl."/get-server-public-key", $queryBuilder )["publicKey"];
//web.php - route page Route::post('/get-server-public-key', [UserController::class, 'getServerPublicKey']);
//UserController.php public function getServerPublicKey( GoBuyEncryption $gobuy ) { $prime = $request->input( "prime" ); $base = $request->input( "base" ); $dh = $gobuy->getDH( $prime, $base ); list($privateKey, $publicKey) = $dh->generateServerKeys( ); // Store sever's private key on the server for the next request. Do not send this key down to the user. Must be protected carefully. Session::put( "serverPrivateKey", (string)$privateKey ); return response()->json(['publicKey' => $publicKey]); }
在UserController
类中的方法看起来像上面那样。现在客户端需要将其公钥发送到服务器,以便服务器生成自己的共享密钥。请不要将客户端的私钥发送到服务器,这是一个安全隐患。
//client3.php //... $clientShareSecret = $dh->computeClientSharedSecret( $clientPrivateKey, $serverPublicKey ); $dh->sendClientPublicKey( $serverUrl . '/compute-shared-secret', [ 'clientPublicKey' => $clientPublicKey ] );
// web.php - route page Route::post('/compute-shared-secret', [UserController::class, 'computeSharedSecret']);
//UserController.php public function computeSharedSecret(Request $request, GoBuyEncryption $gobuy ) { $clientPublicKey = $request->input('clientPublicKey'); $serverPrivateKey = Session::get( "serverPrivateKey" ); $prime = Session::get( "prime" ); $base = Session::get( "base" ); $dh = $gobuy->getDH( $prime, $base ); $serverSharedSecret = $dh->computeSharedSecret( $clientPublicKey, $serverPrivateKey ); return response()->json(['sharedSecret' => $serverSharedSecret]); }
如果Session::get
不适用于您,请考虑以下内容
$path = $gobuy->saveData( $privateKey );
调用此操作以将服务器的私钥保存到您的设备上的一个秘密临时文件中。此文件将在每个周期后立即删除。因此,您可能希望将密钥保存到您认为最适合的位置。
public function getServerPublicKey( Request $request, GoBuyEncryption $gobuy ) { $prime = $request->input( "prime" ); $base = $request->input( "base" ); $dh = $gobuy->getDH( $prime, $base ); list($privateKey, $publicKey) = $dh->generateServerKeys( ); $path = $gobuy->saveData( $privateKey ); // Call this to save server's private key. return response()->json(['publicKey' => $publicKey, 'path' => bin2hex($gobuy->harden( $path, $strongKey )) ]); }
调用saveData
并传递服务器的私钥,以进行此系统的下一阶段。我们鼓励您在传输前通过调用damageThis
对路径进行加固
或破坏;或者像我们演示的那样将其隐蔽
。这是您系统上的一个临时路径,不是密钥。不要将服务器的私钥移动到客户端!!然后
public function computeSharedSecret(Request $request, GoBuyEncryption $gobuy ) { $clientPublicKey = $request->input('clientPublicKey'); $path = $gobuy->ease(hex2bin($request->input('path')), $strongKey ); $serverPrivateKey = $gobuy->getData( $path ); $serverSharedSecret = $dh->computeSharedSecret( $clientPublicKey, $serverPrivateKey ); return response()->json(['sharedSecret' => $serverSharedSecret]); }
您想要像我们上面做的那样简化
路径,以便返回一个更易读的形式。调用getData
将返回服务器的私钥。请小心处理!!我们没有将密钥带到客户端,而是将密钥路径在设备上保存,并在加固后。
对于$serverPrivateKey
,如果一切顺利,您应该得到以下输出
string(77) "812830422017873248489061593359984273276395722610085745773184591622547259
03466"
对于$serverSharedSecret
,您应该得到
{"sharedSecret":"5782213232589419880823134809815678942388436899052383613472946840659
030813339951250867629747368940293046782968831914815037838351722320804215751475560783
7480603217065611487812391300266927278132489371633944691283404075838398607516532"}
如果一切顺利,您应该有一个密钥。
if ( $clientShareSecret === $serverSharedSecret ) { // Use secret here. $symmetricKey = $gobuy->getSymmKey( $clientSharedSecret, "sha256" ); $gobuy->cipher( "Data to encrypt", $symmetricKey ); }
对称密钥生成
在DH密钥交换之后,双方都有一个共同的共享密钥。此共享密钥可用于派生对称加密密钥。然后,对称加密算法(例如,我们上面显示的AES)可以使用此密钥来加密和解密消息,确保只有具有共享密钥的各方才能读取加密的通信。
if ( $clientShareSecret === $serverSharedSecret ) { echo "Successful!!!"; $gobuy->hmac( "Data to hash", $clientSharedSecret, "sha256" ); }
消息认证码(MAC)
共享密钥可用于为每条消息生成消息认证码(MAC)。MAC确保消息的完整性和真实性,表明消息在传输过程中未被更改,并确认发送者的身份。
if ( $clientShareSecret === $serverSharedSecret ) { list( $symmetricKey, $macKey ) = $gobuy->deriveKey( $clientSharedSecret); }
密钥派生
在我们的系统中,共享密钥可以用作密钥派生函数(KDF)的输入,以生成多个密钥,用于不同的加密目的,例如加密密钥、MAC密钥和初始化向量(IV)。
前向安全性
每个会话可以使用通过新的DH密钥交换生成的唯一共享密钥,提供前向保密性。如果长期密钥被泄露,过去的通信仍然安全,因为从共享密钥派生的会话密钥无法进行事后解密。
if ( $clientShareSecret === $serverSharedSecret ) { $digitalSignature = $gobuy->signThis( $clientSharedSecret, 'file://path/to/private/key.pem'); }
安全认证
尽管DH密钥交换本身不提供身份验证,但将共享密钥与数字签名或证书结合可以使用来验证参与方。共享密钥确保只有知道相应私钥的各方才能派生相同的密钥。
椭圆曲线Diffie-Hellman(ECDH)
$curve = $gobuy->generateRandomEllipticCurveParameters();
- 此行调用
$gobuy
对象的generateRandomEllipticCurveParameters
方法。 - 此方法预期返回随机生成的椭圆曲线的参数,通常包括素数
p
、系数a
和b
、基点g
(具有坐标)、阶n
和系数h
。
list($alicePrivateKey, $alicePublicKey) = $gobuy->generateKeyPair($curve);
- 这一行调用了
$gobuy
对象的generateKeyPair
方法,并传递生成的椭圆曲线参数。 - 该方法返回一个包含两个元素的列表:Alice的私钥和Alice的公钥。
list
函数将第一个元素分配给$alicePrivateKey
,第二个元素分配给$alicePublicKey
。
//Blade @php list($bobPrivateKey, $bobPublicKey) = $gobuy->generateKeyPair($curve); @endphp //index.php list($bobPrivateKey, $bobPublicKey) = $gobuy->generateKeyPair($curve);
- 与上一行类似,这一行生成了Bob的一对密钥。
- Bob的私钥分配给
$bobPrivateKey
,Bob的公钥分配给$bobPublicKey
。
$aliceSharedSecret = $gobuy->computeSharedSecret($alicePrivateKey, $bobPublicKey, $curve);
- 这一行调用了
$gobuy
对象的computeSharedSecret
方法。 - 它将Alice的私钥、Bob的公钥和椭圆曲线参数传递给该方法。
- 该方法使用Alice的私钥和Bob的公钥从Alice的角度计算共享密钥。
- 计算得到的共享密钥分配给
$aliceSharedSecret
。
$bobSharedSecret = $gobuy->computeSharedSecret($bobPrivateKey, $alicePublicKey, $curve);
- 同样,这一行使用Bob的私钥和Alice的公钥从Bob的角度计算共享密钥。
- 计算得到的共享密钥分配给
$bobSharedSecret
。
if ($aliceSharedSecret[0] === $bobSharedSecret[0]) { // Use secret here }
- 这一行检查Alice和Bob计算出的共享密钥的第一个元素是否相等。
- 在椭圆曲线Diffie-Hellman(ECDH)的上下文中,如果计算正确,共享密钥应该是相同的。
- 如果共享密钥匹配,则执行
if
块内的代码,其中可以安全地使用共享密钥进行加密或密钥派生等进一步的加密操作。
其他详细信息
-
椭圆曲线参数(
$curve
):- 通常包括
p
:定义有限域的素数。a
和b
:椭圆曲线方程的系数。g
:曲线上的基点(生成点)。n
:基点的阶。h
:伴随因子。
- 通常包括
-
密钥对生成(
generateKeyPair
):- 私钥是在一定范围内随机选择的整数。
- 公钥是通过将基点
g
与私钥相乘得到的椭圆曲线上的一个点。
-
共享密钥计算(
computeSharedSecret
):- 使用ECDH,共享密钥是通过将另一方的公钥与自己私钥相乘来计算的。
- 结果曲线上的点(通常是x坐标)是共享密钥,双方将独立地到达,但如果计算正确,则将是相同的。
总之,这些行执行了ECDH密钥交换协议的基本步骤,包括生成椭圆曲线参数、生成双方的密钥对以及计算共享密钥以确保双方都导出了相同的加密密钥。
证书信息
您可以根据需要使用以下方式获取有关特定证书的信息
$gobuy->certSubject( "path/to/certificate.crt" ); // Fetch the owner of the certificate.
在证书签名的上下文中,主题指的是与证书关联的公钥的实体。它实际上是证书的“所有者”。证书中的主题字段标识了此实体,可能包括如区分名称(DN)之类的属性,它可以包含国家、组织、通用名称等信息。主题对于建立数字通信中的信任至关重要,因为它允许其他人验证公钥属于特定个人或组织。
$gobuy->extractCrlDistributionPoints( "path/to/certificate.crt" ); // Helps you fetch the CRL needed to check if a certificate has been revoked.
证书中的CRL分发点(CDP)是一个扩展,它指定了证书吊销列表(CRL)的位置。CRL是已由签发证书机构(CA)在预定过期日期之前吊销的证书列表,它用于确保这些证书不再被信任。CDP有助于将此列表分发到需要验证证书吊销状态的各方。
$gobuy->extractSerialNumber( "path/to/certificate.crt" ); //
证书序列号是证书机构(CA)为每个SSL证书分配的唯一标识符。它是一个区分不同证书的字母数字字符串,确保每个证书可以单独识别和验证。通过我们,您可以轻松获取此数字,以确保您的数字通信的安全性和完整性,因为它有助于防止证书欺诈和滥用。
$gobuy->certVersion( "path/to/certificate.crt" );
数字证书中的版本字段表示构建证书所使用的X.509标准的迭代版本。每个版本可能会引入新的功能、字段或安全增强功能。例如,较新版本可能支持更强的加密算法或提供改进的证书吊销和管理机制。
以下是版本的简要概述
- 版本1(v1):遵循证书的初始X.509标准。
- 版本2(v2):在版本1包含的字段中增加了两个字段。
- 版本3(v3):代表当前的X.509标准版本,并增加了对证书扩展的支持。
版本字段至关重要,因为它有助于软件和系统正确解释和处理证书的数据。
$gobuy->certSigAlgo( "path/to/certificate.crt" );
数字证书中的签名算法字段指定用于签名证书的算法。这包括哈希函数和数字签名算法。例如,“sha256RSA”表示使用SHA-256哈希函数和RSA数字签名算法。
此字段至关重要,因为它确保了证书的完整性和真实性。当证书签发时,签发证书机构(CA)使用此算法在证书上创建数字签名。其他人可以通过验证此签名来确认证书确实是CA签发的,并且没有被篡改。
$gobuy->certIssuer( "path/to/certificate.crt" );
数字证书中的发行商被称为证书机构(CA)。它是一个受信任的实体,为网站和其他实体签发数字证书。CA验证域名,并根据证书类型,还可能验证网站的拥有权。验证后,CA签发受Chrome、Safari和Firefox等网络浏览器信任的TLS/SSL证书。这个过程有助于通过验证网站和其他实体的合法性来确保互联网上的安全通信¹。
$gobuy->certValidity( "path/to/certificate.crt" );
数字证书中的“字段有效期”指证书的有效期,即证书被认为是可信的时间范围。它由两个关键日期定义
- 不早于:此日期表示证书何时可以被认为是有效的。它可能早于实际签发日期²。
- 不迟于:此日期包含证书过期且不再有效的时间。
在此有效期内,证书可用于建立安全通信并验证用户、设备或网站等实体的身份。一旦证书过期,就必须续签或更换以保持安全。
$gobuy->certSubjectPKI( "path/to/certificate.crt" );
数字证书中的主体公钥信息是包含公钥及其信息的关键部分。它在X.509标准中定义为包括算法标识符和主体的公钥的序列,公钥以位字符串表示¹。
以下是一个简化的解释
- 算法标识符:指定使用的公钥算法类型,如RSA、ECDSA等。
- 主体的公钥:与证书主体的私钥对应的实际公钥。
此信息用于验证签名并建立安全通信。主题公钥信息确保当你收到数字证书时,你可以信任其中包含的公钥确实与证书主题字段中命名的实体相关联。
$gobuy->certPKA( "path/to/certificate.crt" );
数字证书中的公钥算法是一种加密算法,用于生成一对密钥:一个公钥和一个私钥。这些密钥用于加密和解密数据,以及创建和验证数字签名。常见的公钥算法包括RSA(Rivest–Shamir–Adleman)和椭圆曲线密码学(ECC)。这些算法的安全性依赖于某些数学问题的计算难度,使得从公钥中推导私钥变得不可行。
$gobuy->certBitSize( "path/to/certificate.crt" );
这检索用于加密的RSA密钥的大小。显示的数字表示密钥的位数,这是衡量其强度和安全性的指标。2048位的密钥被认为是强大的,并且广泛用于确保互联网通信的安全。
在SSL/TLS证书的上下文中,2048位RSA密钥用于在SSL握手过程中加密随机生成的256位对称密钥。然后,此对称密钥用于加密客户端和服务器之间传输的数据。RSA密钥确保只有预期的接收者才能解密对称密钥,从而确保通信安全。您预期的输出。
00:98:69:57:4c:b2:eb:2e:3b:2d:f8:80:86:9b:c2: 2d:83:e6:2d:a1:db:5e:65:82:e1:87:d8:52:d7:a8: 0d:af:ed:81:17:92:3b:7f:ab:d0:f0:89:db:61:0e: 3a:eb:73:bb:1c:9b:bc:a2:6e:3e:8e:ea:53:ab:4a: 3f:ef:4a:c3:a4:e8:d4:6d:4b:0f:98:b9:14:56:eb: 77:61:7e:0c:2e:13:50:52:f6:d9:a5:28:48:07:e6: 3b:fa:57:3c:44:dd:91:13:c5:7b:36:98:fb:8d:47: 0d:ec:27:57:0d:1a:49:29:01:49:06:db:05:6b:71: 02:43:c3:e2:d9:9e:3d:51:74:01:9c:f7:ca:58:90: f2:ad:42:19:33:df:ad:be:3d:e6:bc:00:2c:af:25: f1:98:cc:90:a6:93:51:20:02:b2:e9:1a:be:f2:9c: 53:f1:37:ff:0d:d0:76:c9:b4:c0:50:71:95:11:f2: 85:cf:e6:5f:f0:d3:e4:a1:95:ae:2d:9f:58:26:66: 50:b3:3a:ee:1d:7a:34:f6:72:6b:35:a3:fc:fe:d4: 94:81:cb:59:14:e3:02:74:4f:7e:aa:98:9f:3c:57: 02:fc:27:11:e6:de:c4:95:60:f1:e7:b1:8a:03:ca: 19:b7:01:a5:c5:ad:c3:cb:43:b4:ba:42:8a:9f:31: a5:d9
$gobuy->certExponent( "path/to/certificate.crt" )
此指数通常用作RSA加密中的公钥指数。它是一个素数,因为它具有某些数学属性,这使得加密和解密过程效率更高。具体来说,它是一个只有两个位被设置的较小的素数,这使得软件中的模幂运算足够快。这种效率对于加密操作的性能至关重要。可能返回:65537
(0x10001)。将65537
用作公钥指数是RSA密码学的标准做法。
$gobuy->certX509v3Ext( "path/to/certificate.crt" );
X.509v3扩展是X.509数字证书标准的关键技术特性,允许在基本证书字段之外包含附加信息。这些扩展可以指定各种属性,如替代主题名称、使用限制等。它们用于增强证书的功能和灵活性,使其适用于各种应用。
$gobuy->certX509v3SKI( "path/to/certificate.crt" );
X509v3主题密钥标识符(SKI)是X.509数字证书中的一个扩展,它为证书中包含的公钥提供一个唯一标识符。此标识符用于将证书与特定的公钥关联起来,这在跟踪和管理密钥时非常有用,特别是在证书颁发机构(CA)发放具有相同主题名称但不同密钥的多个证书的环境中。
$gobuy->certX509v3AKI( "path/to/certificate.crt" );
X509v3授权密钥标识符是数字证书中的一个扩展,用于标识与用于签名证书的私钥对应的公钥。此标识符可以是基于密钥标识符(证书签名人证书中的主题密钥标识符)或发行者名称和序列号。
它充当将证书与其颁发机构链接的方式,这在证书吊销列表(CRL)和建立公钥基础设施(PKI)中的信任特别有用。通过提供对权威机构公钥的明确引用,它有助于确保证书可以正确验证和信任。
$gobuy->certX509v3BC( "path/to/certificate.crt" );
数字证书中的X509v3基本约束扩展用于指示证书持有人是否为证书颁发机构(CA),如果是,则表示认证路径的深度。该扩展指定证书的主题是否为允许颁发子证书的CA。它还定义了有效认证链的最大深度,这对于确保认证链不超过特定长度尤为重要。在X.509数字证书的上下文中,带有critical
标志的基本约束扩展表示该证书是证书颁发机构(CA),并且允许颁发其他证书,即子证书。
$gobuy->certCA( "path/to/certificate.crt" );
在数字证书的上下文中,CA:TRUE
表示该证书由证书颁发机构(CA)签发,并被认为是可信的。这是X.509证书的基本约束扩展的一部分,它指定证书是否可以用于签名其他证书(keyCertSign)以及它是否是根证书(CA)。当CA:TRUE
被设置时,表示该证书是CA证书,可以用于签名其他证书,从而建立信任链。
$gobuy->certSigVal( "path/to/certificate.crt" );
数字证书中的签名值是对ASN.1 DER编码的证书进行的数字签名。此签名使用证书颁发者的私钥创建,用于验证证书的真实性和完整性。签名值确保证书未被篡改,并且确实是由声明的CA签发的。
获取证书吊销列表(CRL)
$crlFile = $gobuy->fetchCRL( "path/to/where/you/will/store/crl_file.crl", "http://crl.godaddy.com/gdig2s1-23.crl" ); $gobuy->decryptCRL( "path/to/where/you/will/store/crl_file.crl", "path/to/decrypted/server_crl_decr.pem" );
对于fetchCRL
方法,您可以简单地调用方法而不带第二个参数,那么GoDaddy端点将是您的默认URL。见下文
$crlFile = $gobuy->fetchCRL( "path/to/where/you/will/store/crl_file.crl" );
异常处理
如果存在文件加密问题,库将抛出异常。请确保在您的应用程序中处理这些异常。
初始工作
CMS签名库是为了提供开发人员使用加密消息语法(CMS)签名文件的易于使用的解决方案而创建的。它简化了在PHP应用程序中确保数据完整性和真实性的过程。初始版本包括核心签名功能、全面的错误处理以及与Monolog的集成。
此外,我们还集成了Diffie-Hellman密钥交换机制、PKCS7加密和解密、信任链和其他API。这些新增功能使库成为开发人员的强大工具,增强了安全性并简化了项目中的加密过程。
贡献
欢迎贡献。请向仓库提交拉取请求。
许可
此库在MIT许可下开源。有关详细信息,请参阅LICENSE文件。
支持
如有支持需求,请在GitHub仓库中提交问题。
作者
- Victory J.M. Uzochukwu - 创建者和首席开发者 - codingdrips1on1
主要贡献者: GoBuy.cheap 和 CodingDrips.eu
供您参考的书籍。
您可以在此处获取副本 here
即将推出!