virgil/sdk

Virgil 是一套安全库栈(ECIES 与 Crypto Agility 结合 Virgil Cryptogram),并提供所有必要的基础设施,以实现任何应用程序、平台或设备的无缝端到端加密。下面列出了目前可用的语言和平台。联系我们以获取更多信息。

v6.4.0 2024-05-01 02:35 UTC

README

Build Status Latest Version on Packagist Total Downloads GitHub license

简介 | SDK 功能 | 安装 | 配置 SDK | 使用示例 | 文档 | 支持

简介

Virgil Security 为添加安全性到任何应用程序提供了一套 API。只需几个简单步骤,您就可以加密通信、安全存储数据并确保数据完整性。Virgil Security 的产品适用于桌面、嵌入式(IoT)、移动、云和 Web 应用程序,支持多种现代编程语言。

Virgil Core SDK 是一个低级别库,允许开发者快速使用 Virgil Cards Service API,并为其新或现有数字解决方案添加端到端安全性。

如果您需要额外的安全功能以支持多设备支持、群组聊天等,请尝试我们的高级 Virgil E3Kit 框架

SDK 功能

安装

Virgil Core SDK 以名为 virgil/sdk 的包提供。该包通过 Composer 包管理器系统分发。

该包适用于 PHP 版本 8.2 及更高版本。

使用包管理器控制台安装包

composer require virgil/sdk

加密扩展通知

为了支持加密操作,您还需要安装 Virgil 加密扩展。我们提供与 Virgil Core SDK 一起使用的自己的扩展,易于任何人使用。要在当前系统中自动安装扩展,只需运行以下命令

./vendor/virgil/crypto-wrapper/_extensions/setup.sh -all -vendor

请注意,crypto-wrapper 包在通过 composer 安装 virgil/sdk 后出现在您的 vendors 中。要检查 Virgil 加密扩展是否正确安装,请运行

php -m

应提供以下扩展:vsce_phe_phpvscf_foundation_phpvscp_pythia_php

注意:如果出现以下警告,则导出环境变量 LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/php7/modules (/usr/lib/php7/modules - 您的 php 扩展路径可能不同)

PHP Warning:  PHP Startup: Unable to load dynamic library 'vsce_phe_php' (tried: /usr/lib/php7/modules/vsce_phe_php (Error loading shared library /usr/lib/php7/modules/vsce_phe_php: No such file or directory), /usr/lib/php7/modules/vsce_phe_php.so (Error loading shared library vscf_foundation_php.so: No such file or directory (needed by /usr/lib/php7/modules/vsce_phe_php.so))) in Unknown on line 0

LD_LIBRARY_PATH 是一个环境变量,它保留所有包含用户动态共享库的路径。

现在Virgil Core SDK已经准备好使用,让我们来配置它并运行一些示例。

配置SDK

本节包含有关如何设置用于用户身份验证、管理Virgil卡和存储私钥的Virgil Core SDK模块的指南。

设置身份验证

使用基于JSON Web Token标准的令牌设置用户身份验证,并进行一些Virgil修改。

为了调用Virgil服务(例如,在Virgil Cards服务上发布用户的卡),您需要一个包含用户身份的JSON Web Token ("JWT"),该身份是一个字符串,用于唯一标识您应用程序中的每个用户。

所需的凭证

在客户端设置JWT提供者

使用以下代码行指定您希望在项目中使用哪个JWT生成源

use Virgil\Sdk\Web\Authorization\CallbackJwtProvider;
use Virgil\Sdk\Web\Authorization\TokenContext;

$authenticatedQueryToServerSide = function (TokenContext $context){
    // Get generated token from server-side
    return "eyJraWQiOiI3MGI0NDdlMzIxZjNhMGZkIiwidHlwIjoiSldUIiwiYWxnIjoiVkVEUzUxMiIsImN0eSI6InZpcmdpbC1qd3Q7dj0xIn0.eyJleHAiOjE1MTg2OTg5MTcsImlzcyI6InZpcmdpbC1iZTAwZTEwZTRlMWY0YmY1OGY5YjRkYzg1ZDc5Yzc3YSIsInN1YiI6ImlkZW50aXR5LUFsaWNlIiwiaWF0IjoxNTE4NjEyNTE3fQ.MFEwDQYJYIZIAWUDBAIDBQAEQP4Yo3yjmt8WWJ5mqs3Yrqc_VzG6nBtrW2KIjP-kxiIJL_7Wv0pqty7PDbDoGhkX8CJa6UOdyn3rBWRvMK7p7Ak";
};

// Setup AccessTokenProvider
$accessTokenProvider = new CallbackJwtProvider($authenticatedQueryToServerSide);

在服务器端生成JWT

接下来,您需要设置JwtGenerator并使用Virgil SDK生成JWT。

以下是生成JWT的示例

use Virgil\Crypto\VirgilCrypto;
use Virgil\Sdk\Web\Authorization\JwtGenerator;

// App Key (you got this Key at Virgil Dashboard)
$privateKeyStr = "MC4CAQAwBQYDK2VwBCIEIH2RKUdXkK/3tfVWO2AJahOhCYG2hCEHg4mPJEAuvmj7";
$appKeyData = base64_decode($privateKeyStr);

// VirgilCrypto imports a private key into a necessary format
$crypto = new VirgilCrypto();
$privateKey = $crypto->importPrivateKey($appKeyData);

// use your App Credentials you got at Virgil Dashboard:
$appId = "be00e10e4e1f4bf58f9b4dc85d79c77a"; // App ID
$appKeyId = "70b447e321f3a0fd";              // App Key ID
$ttl = 3600; // 1 hour (JWT's lifetime)

// setup JWT generator with necessary parameters:
$jwtGenerator = new JwtGenerator($privateKey->getPrivateKey(), $appKeyId, $crypto, $appId, $ttl);

// generate JWT for a user
// remember that you must provide each user with his unique JWT
// each JWT contains unique user's identity (in this case - Alice)
// identity can be any value: name, email, some id etc.
$identity = "Alice";
$token = $jwtGenerator->generateToken($identity);

// as result you get users JWT, it looks like this: "eyJraWQiOiI3MGI0NDdlMzIxZjNhMGZkIiwidHlwIjoiSldUIiwiYWxnIjoiVkVEUzUxMiIsImN0eSI6InZpcmdpbC1qd3Q7dj0xIn0.eyJleHAiOjE1MTg2OTg5MTcsImlzcyI6InZpcmdpbC1iZTAwZTEwZTRlMWY0YmY1OGY5YjRkYzg1ZDc5Yzc3YSIsInN1YiI6ImlkZW50aXR5LUFsaWNlIiwiaWF0IjoxNTE4NjEyNTE3fQ.MFEwDQYJYIZIAWUDBAIDBQAEQP4Yo3yjmt8WWJ5mqs3Yrqc_VzG6nBtrW2KIjP-kxiIJL_7Wv0pqty7PDbDoGhkX8CJa6UOdyn3rBWRvMK7p7Ak"
// you can provide users with JWT at registration or authorization steps
// Send a JWT to client-side
$token->__toString();

对于本小节,我们创建了一个示例后端,演示了如何设置您的后端以生成JWT。要本地设置和运行示例后端,请访问您选择的GitHub仓库

Node.js | Golang | PHP | Java | Python,并遵循README中的说明。

设置卡验证器

Virgil Card Verifier可以帮助您自动验证用户的卡签名,例如,当您从Virgil Cards服务获取卡时。

默认情况下,VirgilCardVerifier仅验证两个签名 - 卡所有者和Virgil Cards服务的签名。

使用以下代码行设置VirgilCardVerifier

use Virgil\Crypto\VirgilCrypto;
use Virgil\Sdk\Verification\VerifierCredentials;
use Virgil\Sdk\Verification\VirgilCardVerifier;
use Virgil\Sdk\Verification\Whitelist;

// initialize Crypto library
$crypto = new VirgilCrypto();

$publicKey = $crypto->importPublicKey("EXPORTED_PUBLIC_KEY");

$yourBackendVerifierCredentials = new VerifierCredentials("YOUR_BACKEND", $publicKey);

$yourBackendWhitelist = new Whitelist([$yourBackendVerifierCredentials]);

$cardVerifier = new VirgilCardVerifier($crypto, true, true, [$yourBackendWhitelist]);

设置卡管理器

本小节展示了如何设置卡管理器模块以帮助您管理用户的公钥。

使用卡管理器,您可以

  • 指定访问令牌(JWT)提供者。
  • 指定用于验证您的用户、您的应用服务器、Virgil服务(可选)签名的卡验证器。

使用以下代码行设置卡管理器

use Virgil\Sdk\CardManager;
use Virgil\Sdk\Verification\VirgilCardVerifier;

$cardVerifier = new VirgilCardVerifier($virgilCrypto, true, true);

// initialize cardManager and specify accessTokenProvider, cardVerifier
$cardManager = new CardManager($virgilCrypto, $accessTokenProvider, $cardVerifier);

使用示例

在开始练习使用示例之前,请确保已配置SDK。有关更多信息,请参阅配置SDK部分。

在卡服务中生成和发布Virgil卡

使用以下代码行创建包含公钥的用户卡并将其发布在Virgil Cards服务上

use Virgil\Crypto\VirgilCrypto;
use Virgil\Sdk\CardParams;

$crypto = new VirgilCrypto();

// generate a key pair
$keyPair = $crypto->generateKeyPair();

// save Alice private key into key storage
$privateKeyStorage->store($keyPair->getPrivateKey(), "Alice");

// create and publish user's card with identity Alice on the Cards Service
$card = $cardManager->publishCard(
    CardParams::create(
        [
            CardParams::PublicKey  => $keyPair->getPublicKey(),
            CardParams::PrivateKey => $keyPair->getPrivateKey(),
        ]
    )
);

签名并加密数据

Virgil Core SDK允许您使用用户的私钥和他们的Virgil卡对任何类型的数据进行签名和加密。

在以下示例中,我们从定制的密钥存储中加载私钥,并从Virgil Cards服务获取接收者的卡。接收者的卡包含公钥,我们将使用它来加密数据并验证签名。

use Virgil\Crypto\Core\VirgilKeys\VirgilPublicKeyCollection;

// prepare a message
$dataToEncrypt = 'Hello, Bob!';

// load a private key from a device storage
$alicePrivateKeyEntry = $privateKeyStorage->load('Alice');

// using cardManager search for Bob's cards on Cards Service
$cards = $cardManager->searchCards('Bob');

$bobRelevantCardsPublicKeys = array_map(
    function (Virgil\Sdk\Card $cards) {
        return $cards->getPublicKey();
    },
    $cards
);

$bobRelevantCardsPublicKeysCollection = new VirgilPublicKeyCollection($bobRelevantCardsPublicKeys);

// sign a message with a private key then encrypt using Bob's public keys
$encryptedData = $crypto->signAndEncrypt(
    $dataToEncrypt,
    $alicePrivateKeyEntry->getPrivateKey(),
    $bobRelevantCardsPublicKeysCollection
);

解密数据和验证签名

一旦用户收到已签名和加密的消息,他们可以使用自己的私钥对其进行解密,并使用发送者的卡验证签名

use Virgil\Crypto\Core\VirgilKeys\VirgilPublicKeyCollection;

// load a private key from a device storage
$bobPrivateKeyEntry = $privateKeyStorage->load('Bob');

// using cardManager search for Alice's cards on Cards Service
$cards = $cardManager->searchCards('Alice');

$aliceRelevantCardsPublicKeys = array_map(
    function (Virgil\Sdk\Card $cards) {
        return $cards->getPublicKey();
    },
    $cards
);

$aliceRelevantCardsPublicKeysCollection = new VirgilPublicKeyCollection($aliceRelevantCardsPublicKeys);

// decrypt with a private key and verify using one of Alice's public keys
$decryptedData = $crypto->decryptAndVerify(
    $encryptedData,
    $bobPrivateKeyEntry->getPrivateKey(),
    $aliceRelevantCardsPublicKeysCollection
);

通过ID获取卡

使用以下代码行通过ID从Virgil Cloud获取用户的卡

// using cardManager get a user's card from the Cards Service
$card = $cardManager->getCard("f4bf9f7fcbedaba0392f108c59d8f4a38b3838efb64877380171b54475c2ade8");

通过用户的身份获取卡

对于单个用户,使用以下代码行通过用户的identity获取用户的卡

// using cardManager search for user's cards on Cards Service
$cards = $cardManager->searchCards("Bob");

吊销卡

如果用户不再需要,您可以撤销其卡片。已撤销的卡片仍可以通过其标识符获取,但在搜索查询中不会出现。

// using cardManager revoke user's card on Cards Service by card id
$cardManager->revokeCard("f4bf9f7fcbedaba0392f108c59d8f4a38b3838efb64877380171b54475c2ade8");

使用 VirgilCrypto 生成密钥对

您可以使用以下代码生成密钥对并将其保存在安全密钥存储中:

use \Virgil\Crypto\VirgilCrypto;

$crypto = new VirgilCrypto();

$keyPair = $crypto->generateKeyPair();

从文件系统密钥存储中保存和检索密钥

use Virgil\Sdk\Storage\PrivateKeyStorage;
use Virgil\Crypto\VirgilCrypto;

$crypto = new VirgilCrypto();

$keyPair = $crypto->generateKeyPair();
$storage = new PrivateKeyStorage($crypto, '/var/www/storage');

$storage->store($keyPair->getPrivateKey(), 'alicePk');

$alicePk = $storage->load('alicePk');

文档

Virgil Security 提供了一组强大的 API,您可以通过开发者文档开始使用。

许可证

本库在3-clause BSD 许可证下发布。

支持

我们的开发者支持团队随时为您提供帮助。有关更多信息,请访问我们的帮助中心

您可以在Twitter上找到我们,或发送电子邮件至support@VirgilSecurity.com

此外,您还可以在我们的Slack社区中从我们的支持团队获得额外帮助。