{"id":259745,"date":"2025-11-25T11:29:15","date_gmt":"2025-11-25T11:29:15","guid":{"rendered":"https:\/\/en-gb.wordpress.org\/plugins\/vessot-secure-portable-data\/"},"modified":"2025-12-02T15:14:40","modified_gmt":"2025-12-02T15:14:40","slug":"vessot-secure-portable-data","status":"publish","type":"plugin","link":"https:\/\/bs.wordpress.org\/plugins\/vessot-secure-portable-data\/","author":23396406,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"1.0.1","stable_tag":"1.0.1","tested":"6.9.4","requires":"5.8","requires_php":"8.2","requires_plugins":null,"header_name":"VESSOT Secure Portable Data","header_author":"VESSOT","header_description":"Zero visibility data storage and consolidation with client-side encryption","assets_banners_color":"","last_updated":"2025-12-02 15:14:40","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/vessot.tech\/wordpress","header_author_uri":"https:\/\/vessot.tech","rating":0,"author_block_rating":0,"active_installs":0,"downloads":146,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation"],"tags":{"1.0.1":{"tag":"1.0.1","author":"jonvessot","date":"2025-12-02 15:14:40"}},"upgrade_notice":[],"ratings":[],"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.1"],"block_files":[],"assets_screenshots":[],"screenshots":[],"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[1556,206074,12167,600],"plugin_category":[54],"plugin_contributors":[],"plugin_business_model":[],"class_list":["post-259745","plugin","type-plugin","status-publish","hentry","plugin_tags-api","plugin_tags-data-storage","plugin_tags-encryption","plugin_tags-security","plugin_category-security-and-spam-protection","plugin_committers-jonvessot"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/vessot-secure-portable-data.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p>VESSOT Secure Portable Data provides a secure way to store and retrieve encrypted data via the VESSOT API. All encryption happens client-side before data is transmitted, ensuring true zero-knowledge data storage.<\/p>\n\n<p>You need to create an account at https:\/\/vessot.tech\/ before you can use this plugin.<\/p>\n\n<h3>Features<\/h3>\n\n<ul>\n<li>Client-side AES-256-GCM encryption<\/li>\n<li>Store, retrieve, update, and destroy encrypted data<\/li>\n<li>Support for nested objects and arrays<\/li>\n<li>WordPress native HTTP API (no external dependencies)<\/li>\n<\/ul>\n\n<h3>Requirements<\/h3>\n\n<ul>\n<li>PHP 8.2 or higher<\/li>\n<li>OpenSSL PHP extension<\/li>\n<\/ul>\n\n<h3>Setup<\/h3>\n\n<p>Read about the simple account creation steps at https:\/\/vessot.tech\/how-it-works.<\/p>\n\n<p>Technical implementation is quick and easy - see the setup guide at https:\/\/vessot.tech\/setup.<\/p>\n\n<h3>Configuration<\/h3>\n\n<p>The plugin requires two environment variables to be set at the server level. This approach ensures credentials never touch your filesystem or version control.<\/p>\n\n<h3>Required Environment Variables<\/h3>\n\n<h4>VESSOT_INT_TOKEN<\/h4>\n\n<p>Your VESSOT API integration token for authentication.<\/p>\n\n<h4>VESSOT_CRYPT_KEY<\/h4>\n\n<p>A 32-byte encryption key for client-side encryption.<\/p>\n\n<h3>Generating an Encryption Key<\/h3>\n\n<p>You can generate a secure encryption key using the plugin's helper function. Run this once in your WordPress environment:<\/p>\n\n<pre><code>`php\n<\/code><\/pre>\n\n<p>$vessotData = vessot_secure_portable_data();\n$encryptionKey = $vessotData-&gt;cryptKeyGenerate(); \/\/ Copy this value to use as VESSOT_CRYPT_KEY\n    `<\/p>\n\n<h3>Setting Environment Variables<\/h3>\n\n<p>Choose the method that matches your server setup:<\/p>\n\n<h4>Apache<\/h4>\n\n<p>Add to your virtual host configuration or <code>.htaccess<\/code>:<\/p>\n\n<pre><code>`apache\n<\/code><\/pre>\n\n<p>SetEnv VESSOT_INT_TOKEN \"your-integration-token-here\"\nSetEnv VESSOT_CRYPT_KEY \"your-encryption-key-here\"\n    `<\/p>\n\n<h4>Nginx with PHP-FPM<\/h4>\n\n<p>Add to your PHP-FPM pool configuration (usually <code>\/etc\/php\/8.2\/fpm\/pool.d\/www.conf<\/code>):<\/p>\n\n<pre><code>`ini\n<\/code><\/pre>\n\n<p>env[VESSOT_INT_TOKEN] = your-integration-token-here\nenv[VESSOT_CRYPT_KEY] = your-encryption-key-here\n    `<\/p>\n\n<p>Then add to your Nginx server block:<\/p>\n\n<pre><code>`nginx\n<\/code><\/pre>\n\n<p>location ~ &#046;php$ {\n    fastcgi_param VESSOT_INT_TOKEN $VESSOT_INT_TOKEN;\n    fastcgi_param VESSOT_CRYPT_KEY $VESSOT_CRYPT_KEY;\n    # ... other fastcgi_param directives\n}\n    `<\/p>\n\n<h4>Docker<\/h4>\n\n<p>Add to your <code>docker-compose.yml<\/code>:<\/p>\n\n<pre><code>`yaml\n<\/code><\/pre>\n\n<p>services:\n  wordpress:\n    environment:\n      - VESSOT_INT_TOKEN=your-integration-token-here\n      - VESSOT_CRYPT_KEY=your-encryption-key-here\n    `<\/p>\n\n<p>Or use a <code>.env<\/code> file (excluded from version control):<\/p>\n\n<pre><code>`bash\n<\/code><\/pre>\n\n<p>VESSOT_INT_TOKEN=your-integration-token-here\nVESSOT_CRYPT_KEY=your-encryption-key-here\n    `<\/p>\n\n<h4>Shared Hosting \/ cPanel<\/h4>\n\n<p>Many hosting providers offer environment variable management through their control panel. Check your hosting provider's documentation for \"Environment Variables\" or \"PHP Configuration\".<\/p>\n\n<h4>Local Development<\/h4>\n\n<p>For local development, you can use:<\/p>\n\n<p><strong>Option 1: System environment variables<\/strong>\n    <code>bash\nexport VESSOT_INT_TOKEN=\"your-dev-token\"\nexport VESSOT_CRYPT_KEY=\"your-dev-key\"<\/code><\/p>\n\n<p><strong>Option 2: PHP-FPM configuration<\/strong> (see Nginx section above)<\/p>\n\n<h3>Security Best Practices<\/h3>\n\n<ul>\n<li>Use different tokens and keys for each environment (development, staging, production)<\/li>\n<li>Never commit environment variables to version control<\/li>\n<li>Limit access to server configuration files<\/li>\n<\/ul>\n\n<h3>Usage<\/h3>\n\n<h3>Basic Example<\/h3>\n\n<pre><code>`php\n<\/code><\/pre>\n\n<p>\/\/ Get an instance\n$vessotData = vessot_secure_portable_data();<\/p>\n\n<p>\/\/ Store encrypted data\n$result = $vessotData-&gt;store('your_unique_storage_key', [\n    'theme' =&gt; 'dark',\n    'notifications' =&gt; true,\n    'email' =&gt; 'user@example.com'\n]);<\/p>\n\n<p>\/\/ Retrieve and decrypt data\n$result = $vessotData-&gt;show('your_unique_storage_key');\nif ($result['success']) {\n    $settings = $result['value'];\n    echo $settings['theme']; \/\/ 'dark'\n}<\/p>\n\n<p>\/\/ Update data\n$result = $vessotData-&gt;update('your_unique_storage_key', [\n    'theme' =&gt; 'light',\n    'notifications' =&gt; false,\n    'email' =&gt; 'user@example.com'\n]);<\/p>\n\n<p>\/\/ Partial update (update specific attributes)\n$result = $vessotData-&gt;update('your_unique_storage_key', null, [\n    'theme' =&gt; 'light'\n]);<\/p>\n\n<p>\/\/ Retrieve specific attribute\n$result = $vessotData-&gt;show('your_unique_storage_key', 'theme');<\/p>\n\n<p>\/\/ Delete data\n$result = $vessotData-&gt;destroy('your_unique_storage_key');\n    `<\/p>\n\n<h3>Using in WordPress Hooks<\/h3>\n\n<pre><code>`php\n<\/code><\/pre>\n\n<p>\/\/ Store user preferences on profile update\nadd_action('profile_update', function($user_id) {\n    $vessotData = vessot_secure_portable_data();\n    $preferences = get_user_meta($user_id, 'preferences', true);<\/p>\n\n<pre><code>$result = $vessotData-&gt;store(\"user_preferences_{$user_id}\", $preferences);\n\nif (!$result['success']) {\n    error_log('Failed to store preferences: ' . $result['error']);\n}\n<\/code><\/pre>\n\n<p>});<\/p>\n\n<p>\/\/ Retrieve preferences on login\nadd_action('wp_login', function($user_login, $user) {\n    $vessotData = vessot_secure_portable_data();\n    $result = $vessotData-&gt;show(\"user_preferences_{$user-&gt;ID}\");<\/p>\n\n<pre><code>if ($result['success']) {\n    update_user_meta($user-&gt;ID, 'preferences', $result['value']);\n}\n<\/code><\/pre>\n\n<p>}, 10, 2);\n    `<\/p>\n\n<h3>API Reference<\/h3>\n\n<h3>store($key, $value)<\/h3>\n\n<p>Store encrypted data with a unique key.<\/p>\n\n<p><strong>Parameters:<\/strong>\n- <code>$key<\/code> (string): Unique identifier for the data\n- <code>$value<\/code> (mixed): Data to encrypt and store (can be string, or data array)<\/p>\n\n<p><strong>Returns:<\/strong> Array with <code>success<\/code>, <code>error<\/code>, <code>code<\/code>, and <code>value<\/code> keys<\/p>\n\n<h3>show($key, $attribute = null)<\/h3>\n\n<p>Retrieve and decrypt stored data.<\/p>\n\n<p><strong>Parameters:<\/strong>\n- <code>$key<\/code> (string): Unique identifier for the data\n- <code>$attribute<\/code> (string|null): Optional specific attribute to retrieve<\/p>\n\n<p><strong>Returns:<\/strong> Array with <code>success<\/code>, <code>error<\/code>, <code>code<\/code>, and <code>value<\/code> keys<\/p>\n\n<h3>update($key, $value = null, $attributes = null)<\/h3>\n\n<p>Update existing encrypted data.<\/p>\n\n<p><strong>Parameters:<\/strong>\n- <code>$key<\/code> (string): Unique identifier for the data\n- <code>$value<\/code> (mixed): New value (for full update)\n- <code>$attributes<\/code> (array|null): Specific attributes to update (for partial update)<\/p>\n\n<p><strong>Returns:<\/strong> Array with <code>success<\/code>, <code>error<\/code>, <code>code<\/code>, and <code>value<\/code> keys<\/p>\n\n<h3>destroy($key, $attributes = null)<\/h3>\n\n<p>Delete stored data.<\/p>\n\n<p><strong>Parameters:<\/strong>\n- <code>$key<\/code> (string): Unique identifier for the data\n- <code>$attributes<\/code> (mixed|null): Optional specific attributes to delete<\/p>\n\n<p><strong>Returns:<\/strong> Array with <code>success<\/code>, <code>error<\/code>, <code>code<\/code>, and <code>value<\/code> keys<\/p>\n\n<h3>cryptKeyGenerate()<\/h3>\n\n<p>Generate a new encryption key. Returns empty string if key already exists in environment.<\/p>\n\n<p><strong>Returns:<\/strong> Encryption key or empty string<\/p>\n\n<h3>External Services<\/h3>\n\n<p>This plugin connects to the VESSOT API (https:\/\/vessot.tech\/api) to store and retrieve encrypted data.<\/p>\n\n<h3>What is VESSOT?<\/h3>\n\n<p>VESSOT is a third-party encrypted data storage service that provides zero-knowledge data storage. The service is provided by VESSOT.<\/p>\n\n<h3>What data is sent?<\/h3>\n\n<p>The plugin sends the following data to the VESSOT API:<\/p>\n\n<ul>\n<li><strong>Encrypted data values<\/strong>: All data is encrypted client-side using AES-256-GCM encryption before transmission. The VESSOT API only receives encrypted ciphertext and never has access to your encryption keys or unencrypted data.<\/li>\n<li><strong>Data keys<\/strong>: Unique identifiers you specify for each piece of data (e.g., \"user_settings\", \"preferences\").<\/li>\n<li><strong>Authentication token<\/strong>: Your VESSOT_INT_TOKEN for API authentication.<\/li>\n<\/ul>\n\n<h3>When is data sent?<\/h3>\n\n<p>Data is transmitted to the VESSOT API when you use any of these functions:<\/p>\n\n<ul>\n<li><code>vessot_secure_portable_data()-&gt;store()<\/code> - Sends encrypted data to be stored<\/li>\n<li><code>vessot_secure_portable_data()-&gt;show()<\/code> - Retrieves encrypted data<\/li>\n<li><code>vessot_secure_portable_data()-&gt;update()<\/code> - Sends encrypted data updates<\/li>\n<li><code>vessot_secure_portable_data()-&gt;destroy()<\/code> - Requests data deletion<\/li>\n<\/ul>\n\n<h3>Service Information<\/h3>\n\n<ul>\n<li><strong>Service Provider<\/strong>: VESSOT<\/li>\n<li><strong>Service Website<\/strong>: https:\/\/vessot.tech<\/li>\n<li><strong>Terms of Service<\/strong>: https:\/\/vessot.tech\/terms-conditions<\/li>\n<li><strong>Privacy Policy<\/strong>: https:\/\/vessot.tech\/privacy-policy<\/li>\n<li><strong>API Documentation<\/strong>: https:\/\/vessot.tech\/setup<\/li>\n<li><strong>WordPress Setup Guide<\/strong>: https:\/\/vessot.tech\/wordpress<\/li>\n<\/ul>\n\n<h3>Account Requirement<\/h3>\n\n<p>You must create a VESSOT account at https:\/\/vessot.tech before using this plugin. See https:\/\/vessot.tech\/how-it-works for account creation steps and https:\/\/vessot.tech\/wordpress for WordPress-specific setup instructions.<\/p>\n\n<h3>Security Notes<\/h3>\n\n<ul>\n<li>All encryption happens client-side before transmission<\/li>\n<li>The VESSOT API never has access to unencrypted data or encryption keys<\/li>\n<li>Environment variables are set at the server level and never touch the filesystem<\/li>\n<li>Each environment should have its own unique tokens and keys<\/li>\n<li>Server configuration changes require appropriate restart (Apache reload, PHP-FPM restart, etc.)<\/li>\n<\/ul>\n\n<h3>Support<\/h3>\n\n<p>For issues and support, visit: https:\/\/vessot.tech<\/p>\n\n<h3>License<\/h3>\n\n<p>This plugin is licensed under the GNU General Public License v2 or later.<\/p>\n\n<p>This program is free software; you can redistribute it and\/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.<\/p>\n\n<p>This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.<\/p>\n\n<p>You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.<\/p>\n\n<h3>Author<\/h3>\n\n<p>VESSOT - https:\/\/vessot.tech<\/p>\n\n<!--section=installation-->\n<h3>Method 1: Install via WordPress Admin (Recommended)<\/h3>\n\n<ol>\n<li>Download the plugin as a ZIP file<\/li>\n<li>In your WordPress admin, go to <strong>Plugins &gt; Add New &gt; Upload Plugin<\/strong><\/li>\n<li>Click <strong>Choose File<\/strong> and select the downloaded ZIP file<\/li>\n<li>Click <strong>Install Now<\/strong><\/li>\n<li>After installation, click <strong>Activate Plugin<\/strong><\/li>\n<li>Configure your environment variables (see Configuration section)<\/li>\n<\/ol>\n\n<h3>Method 2: Manual Installation<\/h3>\n\n<ol>\n<li>Download and extract the plugin ZIP file<\/li>\n<li>Upload the entire plugin folder to <code>\/wp-content\/plugins\/<\/code><\/li>\n<li>Go to <strong>Plugins<\/strong> in your WordPress admin<\/li>\n<li>Find \"VESSOT Secure Portable Data\" and click <strong>Activate<\/strong><\/li>\n<li>Configure your environment variables (see Configuration section)<\/li>\n<\/ol>","raw_excerpt":"VESSOT Secure Portable Data - WordPress Plugin Zero visibility data storage with client-side encryption via the VESSOT platform.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/bs.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/259745","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bs.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/bs.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/bs.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=259745"}],"author":[{"embeddable":true,"href":"https:\/\/bs.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/jonvessot"}],"wp:attachment":[{"href":"https:\/\/bs.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=259745"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/bs.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=259745"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/bs.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=259745"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/bs.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=259745"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/bs.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=259745"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/bs.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=259745"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}