<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                ## 概述 Sodium crypto library是一個現代化的,易于使用的軟件庫,用于加密,解密,簽名,密碼散列等。 Sodium 出現的目的也是為了代替 Mcrypt 這個原來的加密擴展。在 PHP7.2 之后,Mcrypt 已經被移除,在 PHP7.1 時就已經被標記為過時。不過,Sodium 擴展的應用也并不是很多,大部分情況下我們都會使用 OpenSSL 來進行加密操作,同時,Sodium 擴展提供的函數也非常多 Sodium 擴展在 PHP7.2 后是跟隨 PHP 源碼一起發布的,只需要在編譯的時候加上`--with-sodium`即可安裝成功。如果是 PHP7.2 之前的版本,需要單獨安裝這個擴展。同時,操作系統中也需要安裝 `libsodium-devel` 庫 ## 安裝 ``` sudo pecl install -f libsodium ``` 以下表示安裝成功 ``` Build process completed successfully Installing '/usr/local/php-7.4/lib/php/extensions/no-debug-non-zts-20190902/sodium.so' install ok: channel://pecl.php.net/libsodium-2.0.23 configuration option "php_ini" is not set to php.ini location You should add "extension=sodium.so" to php.ini ``` 安裝錯誤 ``` checking for libsodium... configure: error: Please install libsodium - See https://github.com/jedisct1/libsodium ERROR: `/tmp/pear/temp/libsodium/configure --with-php-config=/usr/local/php-7.4/bin/php-config' failed ``` 請安裝擴展系統擴展庫`libsodium-dev` ``` sudo apt install libsodium-dev Reading package lists... Done Building dependency tree Reading state information... Done The following NEW packages will be installed: libsodium-dev 0 upgraded, 1 newly installed, 0 to remove and 254 not upgraded. Need to get 160 kB of archives. After this operation, 760 kB of additional disk space will be used. Get:1 http://mirrors.cloud.aliyuncs.com/ubuntu bionic/main amd64 libsodium-dev amd64 1.0.16-2 [160 kB] Fetched 160 kB in 0s (1,514 kB/s) Selecting previously unselected package libsodium-dev:amd64. (Reading database ... 161808 files and directories currently installed.) Preparing to unpack .../libsodium-dev_1.0.16-2_amd64.deb ... Unpacking libsodium-dev:amd64 (1.0.16-2) ... Setting up libsodium-dev:amd64 (1.0.16-2) ... ``` 修改`php.ini` ``` extension=sodium.so ``` 查看模塊 ``` php -m |grep sodium sodium ``` ## 簡單使用 **加密** ``` <?php /** * @desc libsodium * @author Tinywan(ShaoBo Wan) * @date 2024/8/14 22:45 */ require '../vendor/autoload.php'; $secretKey = sodium_crypto_secretbox_keygen(); $message = 'Sensitive 開源技術小棧'; $nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES); $encryptedMessage = sodium_crypto_secretbox($message, $nonce, $secretKey); var_dump($encryptedMessage); ``` 輸出 ``` string(44) "??|}3?¢?[zm?? n?\?V?ˉC" ``` **解密** ``` $decryptedMessage = sodium_crypto_secretbox_open($encryptedMessage, $nonce, $secretKey); var_dump($decryptedMessage); ``` 輸出 ``` string(28) "Sensitive 開源技術小棧" ``` ## 隨機數據 在使用密碼學時,經常需要隨機字節或整數用于各種目的(加密密鑰,隨機數等)。具體來說,您需要使用密碼學安全隨機數生成器(CSPRNG).一個通用的隨機數生成器是不夠的。 ### 隨機字節 如果你需要一個由隨機字節組成的字符串,你可以使用`\Sodium\randombytes_buf()`。 ``` $string = \Sodium\randombytes_buf($num_bytes); ``` 如果將`$num_bytes`設置為32,則`$string`將是一個32字節的字符串,每個字節將是0到255之間的隨機值的字符表示。 ### 隨機整數 如果你需要一個在0和一個特定上限之間的均勻分布的隨機整數,你可以使用`\Sodium\randombytes_uniform()`。 例如,如果您需要一個介于1和100之間的數字: ``` $int = \Sodium\randombytes_uniform(100) + 1; ``` 請注意,在上面的例子中,`$int`的可能值范圍從1到100,因為`\Sodium\randombytes_uniform`將返回0到99之間的隨機整數。100**不**包括在`\Sodium\randombytes_uniform(100)`的可能輸出值中。 ### 隨機16位整數 返回一個介于0和65535(含)之間的整數,服從均勻分布。 ``` $tcp_port = \Sodium\randombytes_random16(); ``` ## 對稱加密算法 AEAD_AES_256_GCM 對數據進行 AES-256-GCM 加密和解密。可以使用 `openssl` 和 `sodium` 擴展來實現加密,它們都支持 `AES-256-GCM` 算法,下面將給出兩種擴展的代碼示例。 微信支付最新的 V3 版本接口,微信返回的報文中,如果涉及敏感信息,是需要基于 AEAD_AES_256_GCM 進行解密的。在官方文檔中,也提供了 PHP 對應的解密方式,其中使用的就是 Sodium 擴展庫中的函數。 如何解密證書和回調報文:https://pay.weixin.qq.com/docs/merchant/development/interface-rules/certificate-callback-decryption.html#_2-%E8%A7%A3%E5%AF%86 ### Sodium 擴展實現 ```php <?php /** * @desc 對稱加密算法 AES-256-GCM 代碼示例 * @author Tinywan(ShaoBo Wan) * @date 2024/8/14 9:15 */ declare(strict_types=1); /** * @desc 加密 * @param string $data * @param string $keygen * @param string $aad * @return array * @throws SodiumException * @throws \Random\RandomException * @author Tinywan(ShaoBo Wan) */ function aes256gcm_encrypt(string $data, string $keygen, string $aad = ''): array { $iv = random_bytes(SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES); $encrypt = sodium_crypto_aead_aes256gcm_encrypt($data, $aad, $iv, $keygen); return [ 'iv' => sodium_bin2base64($iv, SODIUM_BASE64_VARIANT_ORIGINAL), 'aad' => sodium_bin2base64($aad, SODIUM_BASE64_VARIANT_ORIGINAL), 'cipher_text' => sodium_bin2base64($encrypt, SODIUM_BASE64_VARIANT_ORIGINAL), ]; } /** * @desc 解密 * @param array $secretData * @param string $keygen * @return false|string * @throws SodiumException * @author Tinywan(ShaoBo Wan) */ function aes256gcm_decrypt(array $secretData, string $keygen) { $iv = sodium_base642bin($secretData['iv'], SODIUM_BASE64_VARIANT_ORIGINAL); $aad = sodium_base642bin($secretData['aad'], SODIUM_BASE64_VARIANT_ORIGINAL); $cipherText = sodium_base642bin($secretData['cipher_text'], SODIUM_BASE64_VARIANT_ORIGINAL); return sodium_crypto_aead_aes256gcm_decrypt($cipherText, $aad, $iv, $keygen); } /** * @desc 主函數 * @return void * @throws SodiumException * @throws \Random\RandomException * @author Tinywan(ShaoBo Wan) */ function main() { if (!sodium_crypto_aead_aes256gcm_is_available()) { exit('Not support AES-256-GCM'); } // 生成AES-256-GCM的密鑰 $keygen = sodium_crypto_aead_aes256gcm_keygen(); // 加密原文內容 $data = '開源技術小棧'; $secretData = aes256gcm_encrypt($data, $keygen, 'tinywan'); // 解密 $plainText = aes256gcm_decrypt($secretData, $keygen); echo '[x] 加密原文:' .$data.PHP_EOL; echo '[x] 密文數據:' . json_encode($secretData) .PHP_EOL; echo '[x] 解密原文:' .$plainText.PHP_EOL; } main(); ``` 執行結果 ```ts [x] 加密原文:開源技術小棧 [x] 密文數據:{"iv":"KGMwg3PKlihp46qo","aad":"dGlueXdhbg==","cipher_text":"6oRb78FP33byDBhlBc0g6e7DYH0k3Oiethup+4YeWPN4Xw=="} [x] 解密原文:開源技術小棧 ``` ### Openssl擴展實現 ```php <?php /** * @desc openssl.php * @author Tinywan(ShaoBo Wan) * @date 2024/8/14 9:22 */ declare(strict_types=1); /** * @desc 加密 * @param string $data * @param string $keygen * @param string $aad * @return array * @throws \Random\RandomException * @author Tinywan(ShaoBo Wan) */ function aes256gcm_encrypt(string $data, string $keygen, string $aad = ''): array { $cipher = 'aes-256-gcm'; $ivLen = openssl_cipher_iv_length($cipher); $iv = random_bytes($ivLen); $encrypt = openssl_encrypt($data, $cipher, $keygen, OPENSSL_RAW_DATA, $iv, $tag, $aad); return [ 'iv' => base64_encode($iv), 'tag' => base64_encode($tag), 'aad' => base64_encode($aad), 'cipher_text' => base64_encode($encrypt), ]; } /** * @desc 解密 * @param array $secretData * @param string $keygen * @return false|string * @author Tinywan(ShaoBo Wan) */ function aes256gcm_decrypt(array $secretData, string $keygen) { $iv = base64_decode($secretData['iv']); $tag = base64_decode($secretData['tag']); $aad = base64_decode($secretData['aad']); $cipherText = base64_decode($secretData['cipher_text']); $cipher = 'aes-256-gcm'; return openssl_decrypt($cipherText, $cipher, $keygen, OPENSSL_RAW_DATA, $iv, $tag, $aad); } /** * @desc 主函數 * @return void * @throws SodiumException * @throws \Random\RandomException * @author Tinywan(ShaoBo Wan) */ function main() { // AES-256-GCM需要32字節的密鑰 $keygen = bin2hex(random_bytes(16)); // 加密 $data = '開源技術小棧'; $secretData = aes256gcm_encrypt($data, $keygen, 'tinywan'); // 解密 $plainText = aes256gcm_decrypt($secretData, $keygen); echo '[x] 加密原文:' . $data . PHP_EOL; echo '[x] 密文數據:' . json_encode($secretData) . PHP_EOL; echo '[x] 解密原文:' . $plainText . PHP_EOL; } main(); ``` 執行結果 ```ts [x] 加密原文:開源技術小棧 [x] 密文數據:{"iv":"CUit1bBOIOOM4Oaa","tag":"hlyP0MpykCNekBd1Kkobdw==","aad":"dGlueXdhbg==","cipher_text":"ToKc2+rVh8udQa\/bUtKodoC+"} [x] 解密原文:開源技術小棧 ``` ### AAD參數(Additional Authenticated Data) 在上面的代碼示例中,可以看到在加密的時候有一個`$aad`參數,如果在加密的時候使用了這個參數,那么在解密時也需要使用同樣的AAD值才能成功解密。 > 什么時候會需要用到AAD呢? 用戶`Tinywan`在微信公眾號上寫了一篇私密文章,微信公眾號使用 `AES-256-GCM` 加密了這篇文章,然后存儲到了數據庫里,`AAD`的取值是`Tinywan`的用戶`ID`。 后續如果`Tinywan`去查看這篇文章,微信公眾號會使用`Tinywan`的用戶`ID(AAD值)`去解密,因為解密的`AAD`值與加密的`AAD`值相同,所以可以成功解密。 然后有一個黑客`ShaoBoWan`,他也向微信公眾號發出解密這篇文章的請求,微信公眾號就會使用`ShaoBoWan`的用戶`ID`作為`AAD`去解密這篇文章,但因為`AAD`值錯誤,肯定是解密不了的,所以這時候`AAD`的作用就體現了出來。 ## 其他 https://paragonie.com/book/pecl-libsodium https://cloud.tencent.com/developer/information/%E5%9C%A8PHP%E5%87%BD%E6%95%B0%E4%B8%AD%E4%BD%BF%E7%94%A8Sodium%E5%BA%93-article https://paragonie.com/book/pecl-libsodium/read/00-intro.md#what-is-libsodium
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看