blog.hugopoi.net/www/.content.EZtzwPjb/html/a6a3273c26715c0a8db45364955...

550 lines
48 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset='UTF-8'>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="profile" href="http://gmpg.org/xfn/11">
<link rel="pingback" href="/xmlrpc.php">
<title>How to decrypt flows_cred.json from NodeRED data ? &#8211; HugoPoi</title>
<meta name='robots' content='max-image-preview:large' />
<link rel='dns-prefetch' href='//fonts.googleapis.com' />
<link rel='dns-prefetch' href='//s.w.org' />
<link rel="alternate" type="application/rss+xml" title="HugoPoi &raquo; Feed" href="/en/feed/" />
<link rel="alternate" type="application/rss+xml" title="HugoPoi &raquo; Comments Feed" href="/en/comments/feed/" />
<link rel="alternate" type="application/rss+xml" title="HugoPoi &raquo; How to decrypt flows_cred.json from NodeRED data ? Comments Feed" href="/en/2021/12/28/how-to-decrypt-flows_cred-json-from-nodered-data/feed/" />
<script type="text/javascript">
window._wpemojiSettings = {"baseUrl":"https:\/\/s.w.org\/images\/core\/emoji\/13.1.0\/72x72\/","ext":".png","svgUrl":"https:\/\/s.w.org\/images\/core\/emoji\/13.1.0\/svg\/","svgExt":".svg","source":{"concatemoji":"https:\/\/blog.hugopoi.net\/wp-includes\/js\/wp-emoji-release.min.js?ver=5.8.2"}};
!function(e,a,t){var n,r,o,i=a.createElement("canvas"),p=i.getContext&&i.getContext("2d");function s(e,t){var a=String.fromCharCode;p.clearRect(0,0,i.width,i.height),p.fillText(a.apply(this,e),0,0);e=i.toDataURL();return p.clearRect(0,0,i.width,i.height),p.fillText(a.apply(this,t),0,0),e===i.toDataURL()}function c(e){var t=a.createElement("script");t.src=e,t.defer=t.type="text/javascript",a.getElementsByTagName("head")[0].appendChild(t)}for(o=Array("flag","emoji"),t.supports={everything:!0,everythingExceptFlag:!0},r=0;r<o.length;r++)t.supports[o[r]]=function(e){if(!p||!p.fillText)return!1;switch(p.textBaseline="top",p.font="600 32px Arial",e){case"flag":return s([127987,65039,8205,9895,65039],[127987,65039,8203,9895,65039])?!1:!s([55356,56826,55356,56819],[55356,56826,8203,55356,56819])&&!s([55356,57332,56128,56423,56128,56418,56128,56421,56128,56430,56128,56423,56128,56447],[55356,57332,8203,56128,56423,8203,56128,56418,8203,56128,56421,8203,56128,56430,8203,56128,56423,8203,56128,56447]);case"emoji":return!s([10084,65039,8205,55357,56613],[10084,65039,8203,55357,56613])}return!1}(o[r]),t.supports.everything=t.supports.everything&&t.supports[o[r]],"flag"!==o[r]&&(t.supports.everythingExceptFlag=t.supports.everythingExceptFlag&&t.supports[o[r]]);t.supports.everythingExceptFlag=t.supports.everythingExceptFlag&&!t.supports.flag,t.DOMReady=!1,t.readyCallback=function(){t.DOMReady=!0},t.supports.everything||(n=function(){t.readyCallback()},a.addEventListener?(a.addEventListener("DOMContentLoaded",n,!1),e.addEventListener("load",n,!1)):(e.attachEvent("onload",n),a.attachEvent("onreadystatechange",function(){"complete"===a.readyState&&t.readyCallback()})),(n=t.source||{}).concatemoji?c(n.concatemoji):n.wpemoji&&n.twemoji&&(c(n.twemoji),c(n.wpemoji)))}(window,document,window._wpemojiSettings);
</script>
<style type="text/css">
img.wp-smiley,
img.emoji {
display: inline !important;
border: none !important;
box-shadow: none !important;
height: 1em !important;
width: 1em !important;
margin: 0 .07em !important;
vertical-align: -0.1em !important;
background: none !important;
padding: 0 !important;
}
</style>
<link rel='stylesheet' id='wp-block-library-css' href='/wp-includes/css/dist/block-library/style.min.css?ver=5.8.2' type='text/css' media='all' />
<link rel='stylesheet' id='wp-syntax-css-css' href='/wp-content/plugins/wp-syntax/css/wp-syntax.css?ver=1.1' type='text/css' media='all' />
<link rel='stylesheet' id='bootstrap-css' href='/wp-content/themes/hestia/assets/bootstrap/css/bootstrap.min.css?ver=1.0.2' type='text/css' media='all' />
<link rel='stylesheet' id='hestia-font-sizes-css' href='/wp-content/themes/hestia/assets/css/font-sizes.min.css?ver=3.0.20' type='text/css' media='all' />
<link rel='stylesheet' id='hestia_style-css' href='/wp-content/themes/hestia/style.min.css?ver=3.0.20' type='text/css' media='all' />
<style id='hestia_style-inline-css' type='text/css'>
.hestia-top-bar, .hestia-top-bar .widget.widget_shopping_cart .cart_list {
background-color: #363537
}
.hestia-top-bar .widget .label-floating input[type=search]:-webkit-autofill {
-webkit-box-shadow: inset 0 0 0px 9999px #363537
}.hestia-top-bar, .hestia-top-bar .widget .label-floating input[type=search], .hestia-top-bar .widget.widget_search form.form-group:before, .hestia-top-bar .widget.widget_product_search form.form-group:before, .hestia-top-bar .widget.widget_shopping_cart:before {
color: #ffffff
}
.hestia-top-bar .widget .label-floating input[type=search]{
-webkit-text-fill-color:#ffffff !important
}
.hestia-top-bar div.widget.widget_shopping_cart:before, .hestia-top-bar .widget.widget_product_search form.form-group:before, .hestia-top-bar .widget.widget_search form.form-group:before{
background-color: #ffffff
}.hestia-top-bar a, .hestia-top-bar .top-bar-nav li a {
color: #ffffff
}
.hestia-top-bar ul li a[href*="mailto:"]:before, .hestia-top-bar ul li a[href*="tel:"]:before{
background-color: #ffffff
}
.hestia-top-bar a:hover, .hestia-top-bar .top-bar-nav li a:hover {
color: #eeeeee
}
.hestia-top-bar ul li:hover a[href*="mailto:"]:before, .hestia-top-bar ul li:hover a[href*="tel:"]:before{
background-color: #eeeeee
}
a,
.navbar .dropdown-menu li:hover > a,
.navbar .dropdown-menu li:focus > a,
.navbar .dropdown-menu li:active > a,
.navbar .navbar-nav > li .dropdown-menu li:hover > a,
body:not(.home) .navbar-default .navbar-nav > .active:not(.btn) > a,
body:not(.home) .navbar-default .navbar-nav > .active:not(.btn) > a:hover,
body:not(.home) .navbar-default .navbar-nav > .active:not(.btn) > a:focus,
a:hover,
.card-blog a.moretag:hover,
.card-blog a.more-link:hover,
.widget a:hover,
.has-text-color.has-accent-color,
p.has-text-color a {
color:#05ad13;
}
.svg-text-color{
fill:#05ad13;
}
.pagination span.current, .pagination span.current:focus, .pagination span.current:hover {
border-color:#05ad13
}
button,
button:hover,
.woocommerce .track_order button[type="submit"],
.woocommerce .track_order button[type="submit"]:hover,
div.wpforms-container .wpforms-form button[type=submit].wpforms-submit,
div.wpforms-container .wpforms-form button[type=submit].wpforms-submit:hover,
input[type="button"],
input[type="button"]:hover,
input[type="submit"],
input[type="submit"]:hover,
input#searchsubmit,
.pagination span.current,
.pagination span.current:focus,
.pagination span.current:hover,
.btn.btn-primary,
.btn.btn-primary:link,
.btn.btn-primary:hover,
.btn.btn-primary:focus,
.btn.btn-primary:active,
.btn.btn-primary.active,
.btn.btn-primary.active:focus,
.btn.btn-primary.active:hover,
.btn.btn-primary:active:hover,
.btn.btn-primary:active:focus,
.btn.btn-primary:active:hover,
.hestia-sidebar-open.btn.btn-rose,
.hestia-sidebar-close.btn.btn-rose,
.hestia-sidebar-open.btn.btn-rose:hover,
.hestia-sidebar-close.btn.btn-rose:hover,
.hestia-sidebar-open.btn.btn-rose:focus,
.hestia-sidebar-close.btn.btn-rose:focus,
.label.label-primary,
.hestia-work .portfolio-item:nth-child(6n+1) .label,
.nav-cart .nav-cart-content .widget .buttons .button,
.has-accent-background-color[class*="has-background"] {
background-color: #05ad13;
}
@media (max-width: 768px) {
.navbar-default .navbar-nav>li>a:hover,
.navbar-default .navbar-nav>li>a:focus,
.navbar .navbar-nav .dropdown .dropdown-menu li a:hover,
.navbar .navbar-nav .dropdown .dropdown-menu li a:focus,
.navbar button.navbar-toggle:hover,
.navbar .navbar-nav li:hover > a i {
color: #05ad13;
}
}
body:not(.woocommerce-page) button:not([class^="fl-"]):not(.hestia-scroll-to-top):not(.navbar-toggle):not(.close),
body:not(.woocommerce-page) .button:not([class^="fl-"]):not(hestia-scroll-to-top):not(.navbar-toggle):not(.add_to_cart_button):not(.product_type_grouped):not(.product_type_external),
div.wpforms-container .wpforms-form button[type=submit].wpforms-submit,
input[type="submit"],
input[type="button"],
.btn.btn-primary,
.widget_product_search button[type="submit"],
.hestia-sidebar-open.btn.btn-rose,
.hestia-sidebar-close.btn.btn-rose,
.everest-forms button[type=submit].everest-forms-submit-button {
-webkit-box-shadow: 0 2px 2px 0 rgba(5,173,19,0.14),0 3px 1px -2px rgba(5,173,19,0.2),0 1px 5px 0 rgba(5,173,19,0.12);
box-shadow: 0 2px 2px 0 rgba(5,173,19,0.14),0 3px 1px -2px rgba(5,173,19,0.2),0 1px 5px 0 rgba(5,173,19,0.12);
}
.card .header-primary, .card .content-primary,
.everest-forms button[type=submit].everest-forms-submit-button {
background: #05ad13;
}
body:not(.woocommerce-page) .button:not([class^="fl-"]):not(.hestia-scroll-to-top):not(.navbar-toggle):not(.add_to_cart_button):hover,
body:not(.woocommerce-page) button:not([class^="fl-"]):not(.hestia-scroll-to-top):not(.navbar-toggle):not(.close):hover,
div.wpforms-container .wpforms-form button[type=submit].wpforms-submit:hover,
input[type="submit"]:hover,
input[type="button"]:hover,
input#searchsubmit:hover,
.widget_product_search button[type="submit"]:hover,
.pagination span.current,
.btn.btn-primary:hover,
.btn.btn-primary:focus,
.btn.btn-primary:active,
.btn.btn-primary.active,
.btn.btn-primary:active:focus,
.btn.btn-primary:active:hover,
.hestia-sidebar-open.btn.btn-rose:hover,
.hestia-sidebar-close.btn.btn-rose:hover,
.pagination span.current:hover,
.everest-forms button[type=submit].everest-forms-submit-button:hover,
.everest-forms button[type=submit].everest-forms-submit-button:focus,
.everest-forms button[type=submit].everest-forms-submit-button:active {
-webkit-box-shadow: 0 14px 26px -12px rgba(5,173,19,0.42),0 4px 23px 0 rgba(0,0,0,0.12),0 8px 10px -5px rgba(5,173,19,0.2);
box-shadow: 0 14px 26px -12px rgba(5,173,19,0.42),0 4px 23px 0 rgba(0,0,0,0.12),0 8px 10px -5px rgba(5,173,19,0.2);
color: #fff;
}
.form-group.is-focused .form-control {
background-image: -webkit-gradient(linear,left top, left bottom,from(#05ad13),to(#05ad13)),-webkit-gradient(linear,left top, left bottom,from(#d2d2d2),to(#d2d2d2));
background-image: -webkit-linear-gradient(linear,left top, left bottom,from(#05ad13),to(#05ad13)),-webkit-linear-gradient(linear,left top, left bottom,from(#d2d2d2),to(#d2d2d2));
background-image: linear-gradient(linear,left top, left bottom,from(#05ad13),to(#05ad13)),linear-gradient(linear,left top, left bottom,from(#d2d2d2),to(#d2d2d2));
}
.navbar:not(.navbar-transparent) li:not(.btn):hover > a,
.navbar li.on-section:not(.btn) > a,
.navbar.full-screen-menu.navbar-transparent li:not(.btn):hover > a,
.navbar.full-screen-menu .navbar-toggle:hover,
.navbar:not(.navbar-transparent) .nav-cart:hover,
.navbar:not(.navbar-transparent) .hestia-toggle-search:hover {
color:#05ad13
}
.header-filter-gradient {
background: linear-gradient(45deg, rgba(168,29,132,1) 0%, rgb(234,57,111) 100%);
}
.has-text-color.has-header-gradient-color { color: #a81d84; }
.has-header-gradient-background-color[class*="has-background"] { background-color: #a81d84; }
.has-text-color.has-background-color-color { color: #000000; }
.has-background-color-background-color[class*="has-background"] { background-color: #000000; }
.btn.btn-primary:not(.colored-button):not(.btn-left):not(.btn-right):not(.btn-just-icon):not(.menu-item), input[type="submit"]:not(.search-submit), body:not(.woocommerce-account) .woocommerce .button.woocommerce-Button, .woocommerce .product button.button, .woocommerce .product button.button.alt, .woocommerce .product #respond input#submit, .woocommerce-cart .blog-post .woocommerce .cart-collaterals .cart_totals .checkout-button, .woocommerce-checkout #payment #place_order, .woocommerce-account.woocommerce-page button.button, .woocommerce .track_order button[type="submit"], .nav-cart .nav-cart-content .widget .buttons .button, .woocommerce a.button.wc-backward, body.woocommerce .wccm-catalog-item a.button, body.woocommerce a.wccm-button.button, form.woocommerce-form-coupon button.button, div.wpforms-container .wpforms-form button[type=submit].wpforms-submit, div.woocommerce a.button.alt, div.woocommerce table.my_account_orders .button, .btn.colored-button, .btn.btn-left, .btn.btn-right, .btn:not(.colored-button):not(.btn-left):not(.btn-right):not(.btn-just-icon):not(.menu-item):not(.hestia-sidebar-open):not(.hestia-sidebar-close){ padding-top:15px; padding-bottom:15px; padding-left:33px; padding-right:33px; }
.btn.btn-primary:not(.colored-button):not(.btn-left):not(.btn-right):not(.btn-just-icon):not(.menu-item), input[type="submit"]:not(.search-submit), body:not(.woocommerce-account) .woocommerce .button.woocommerce-Button, .woocommerce .product button.button, .woocommerce .product button.button.alt, .woocommerce .product #respond input#submit, .woocommerce-cart .blog-post .woocommerce .cart-collaterals .cart_totals .checkout-button, .woocommerce-checkout #payment #place_order, .woocommerce-account.woocommerce-page button.button, .woocommerce .track_order button[type="submit"], .nav-cart .nav-cart-content .widget .buttons .button, .woocommerce a.button.wc-backward, body.woocommerce .wccm-catalog-item a.button, body.woocommerce a.wccm-button.button, form.woocommerce-form-coupon button.button, div.wpforms-container .wpforms-form button[type=submit].wpforms-submit, div.woocommerce a.button.alt, div.woocommerce table.my_account_orders .button, input[type="submit"].search-submit, .hestia-view-cart-wrapper .added_to_cart.wc-forward, .woocommerce-product-search button, .woocommerce-cart .actions .button, #secondary div[id^=woocommerce_price_filter] .button, .woocommerce div[id^=woocommerce_widget_cart].widget .buttons .button, .searchform input[type=submit], .searchform button, .search-form:not(.media-toolbar-primary) input[type=submit], .search-form:not(.media-toolbar-primary) button, .woocommerce-product-search input[type=submit], .btn.colored-button, .btn.btn-left, .btn.btn-right, .btn:not(.colored-button):not(.btn-left):not(.btn-right):not(.btn-just-icon):not(.menu-item):not(.hestia-sidebar-open):not(.hestia-sidebar-close){border-radius:3px;}
@media (min-width: 769px){
.page-header.header-small .hestia-title,
.page-header.header-small .title,
h1.hestia-title.title-in-content,
.main article.section .has-title-font-size {
font-size: 42px;
}}
</style>
<link rel='stylesheet' id='hestia_fonts-css' href='https://fonts.googleapis.com/css?family=Roboto%3A300%2C400%2C500%2C700%7CRoboto+Slab%3A400%2C700&#038;subset=latin%2Clatin-ext&#038;ver=3.0.20' type='text/css' media='all' />
<script type='text/javascript' src='/wp-includes/js/jquery/jquery.min.js?ver=3.6.0' id='jquery-core-js'></script>
<script type='text/javascript' src='/wp-includes/js/jquery/jquery-migrate.min.js?ver=3.3.2' id='jquery-migrate-js'></script>
<link rel="https://api.w.org/" href="/wp-json/" /><link rel="alternate" type="application/json" href="/wp-json/wp/v2/posts/1320" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="/xmlrpc.php?rsd" />
<link rel="wlwmanifest" type="application/wlwmanifest+xml" href="/wp-includes/wlwmanifest.xml" />
<meta name="generator" content="WordPress 5.8.2" />
<link rel="canonical" href="/en/2021/12/28/how-to-decrypt-flows_cred-json-from-nodered-data/" />
<link rel='shortlink' href='/?p=1320' />
<link rel="alternate" type="application/json+oembed" href="/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fblog.hugopoi.net%2Fen%2F2021%2F12%2F28%2Fhow-to-decrypt-flows_cred-json-from-nodered-data%2F" />
<link rel="alternate" type="text/xml+oembed" href="/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fblog.hugopoi.net%2Fen%2F2021%2F12%2F28%2Fhow-to-decrypt-flows_cred-json-from-nodered-data%2F&#038;format=xml" />
<meta name="description" content="" />
<style type="text/css" id="custom-background-css">
body.custom-background { background-color: #000000; }
</style>
<style type="text/css" id="wp-custom-css">
@media only screen and (min-width:1440px){
/* styles for browsers larger than 1440px; */
.container{
width: 1600px;
}
}
.wp-block {
max-width: initial;
} </style>
</head>
<body class="post-template-default single single-post postid-1320 single-format-standard custom-background blog-post header-layout-default">
<div class="wrapper post-1320 post type-post status-publish format-standard hentry category-news-en tag-bash-en tag-flows-credential-en tag-nodered-en tag-openssl-en default ">
<header class="header ">
<div style="display: none"></div> <nav class="navbar navbar-default navbar-fixed-top hestia_left navbar-not-transparent">
<div class="container">
<div class="navbar-header">
<div class="title-logo-wrapper">
<a class="navbar-brand" href="/en/"
title="HugoPoi">
<p>HugoPoi</p></a>
</div>
<div class="navbar-toggle-wrapper">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#main-navigation">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="sr-only">Toggle Navigation</span>
</button>
</div>
</div>
<div id="main-navigation" class="collapse navbar-collapse"><ul id="menu-main-menu" class="nav navbar-nav"><li id="menu-item-985" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-985"><a title="Home" href="/">Home</a></li>
<li id="menu-item-1281" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-1281"><a title="Videos" href="https://stream.hugopoi.net/channel/1/">Videos</a></li>
<li id="menu-item-1332-fr" class="lang-item lang-item-204 lang-item-fr no-translation lang-item-first menu-item menu-item-type-custom menu-item-object-custom menu-item-1332-fr"><a title="Français" href="/" hreflang="fr-FR" lang="fr-FR">Français</a></li>
<li id="menu-item-1332-en" class="lang-item lang-item-206 lang-item-en current-lang menu-item menu-item-type-custom menu-item-object-custom menu-item-1332-en"><a title="English" href="/en/2021/12/28/how-to-decrypt-flows_cred-json-from-nodered-data/" hreflang="en-US" lang="en-US">English</a></li>
</ul></div> </div>
</nav>
</header>
<div id="primary" class="boxed-layout-header page-header header-small" data-parallax="active" ><div class="container"><div class="row"><div class="col-md-10 col-md-offset-1 text-center"><h1 class="hestia-title entry-title">How to decrypt flows_cred.json from NodeRED data ?</h1><h4 class="author">Published by <a href="/en/author/hugopoi/" class="vcard author"><strong class="fn">HugoPoi</strong></a> on <time class="entry-date published" datetime="2021-12-28T00:17:36+01:00" content="2021-12-28">28 December 2021</time><time class="updated hestia-hidden" datetime="2021-12-28T00:26:42+01:00">28 December 2021</time></h4></div></div></div><div class="header-filter" style="background-image: url(/wp-content/uploads/2017/06/IMG_20170528_085824.jpg);"></div></div>
<div class="main main-raised ">
<div class="blog-post blog-post-wrapper">
<div class="container">
<article id="post-1320" class="section section-text">
<div class="row">
<div class="col-md-8 single-post-container" data-layout="sidebar-right">
<div class="single-post-wrap entry-content"><h2>1. Digging the code</h2>
<p>The first step is to reverse the code from NodeRED, simple steps<br />
1. Clone the sources<br />
<code>git clone https://github.com/node-red/node-red.git</code><br />
2. Dig with grep in the code<br />
<code>grep -ril crypto packages/</code></p>
<pre><code class=""> packages/node_modules/@node-red/editor-api/lib/auth/index.js
packages/node_modules/@node-red/editor-api/lib/auth/strategies.js
packages/node_modules/@node-red/editor-api/lib/auth/tokens.js
packages/node_modules/@node-red/editor-api/lib/editor/comms.js
packages/node_modules/@node-red/editor-client/src/js/ui/editors/code-editors/monaco.js
packages/node_modules/@node-red/editor-client/src/types/README.md
packages/node_modules/@node-red/editor-client/src/types/node/crypto.d.ts
packages/node_modules/@node-red/editor-client/src/types/node/tls.d.ts
packages/node_modules/@node-red/editor-client/src/vendor/monaco/dist/editor.js
packages/node_modules/@node-red/editor-client/src/vendor/monaco/dist/html.worker.js
packages/node_modules/@node-red/editor-client/src/vendor/monaco/dist/ts.worker.js
packages/node_modules/@node-red/nodes/core/common/60-link.js
packages/node_modules/@node-red/nodes/core/network/21-httprequest.js
packages/node_modules/@node-red/runtime/lib/nodes/credentials.js
packages/node_modules/@node-red/runtime/lib/storage/index.js
packages/node_modules/@node-red/runtime/lib/storage/localfilesystem/projects/git/authServer.js
packages/node_modules/@node-red/runtime/lib/storage/localfilesystem/projects/index.js
packages/node_modules/node-red/red.js
</code></pre>
<ol start="3">
<li>Find the interesting parts<br />
<code>packages/node_modules/@node-red/runtime/lib/nodes/credentials.js</code> file name looks promising.</li>
</ol>
<pre><code class="language-javascript ">function decryptCredentials(key,credentials) {
var creds = credentials["$"];
var initVector = Buffer.from(creds.substring(0, 32),'hex');
creds = creds.substring(32);
var decipher = crypto.createDecipheriv(encryptionAlgorithm, key, initVector);
var decrypted = decipher.update(creds, 'base64', 'utf8') + decipher.final('utf8');
return JSON.parse(decrypted);
}
</code></pre>
<p>and</p>
<pre><code class="language-javascript "> var defaultKey;
try {
defaultKey = settings.get('_credentialSecret');
} catch(err) {
}
if (defaultKey) {
defaultKey = crypto.createHash('sha256').update(defaultKey).digest();
encryptionKeyType = "system";
}
</code></pre>
<p>and</p>
<pre><code class="language-javascript "> // Check if we have a generated _credSecret to decrypt with and remove
if (defaultKey) {
log.debug("red/runtime/nodes/credentials.load : default key present. Will migrate");
if (credentialsEncrypted) {
try {
credentials = decryptCredentials(defaultKey,credentials)
} catch(err) {
credentials = {};
log.warn(log._("nodes.credentials.error",{message:err.toString()}))
var error = new Error("Failed to decrypt credentials");
error.code = "credentials_load_failed";
throw error;
}
}
dirty = true;
removeDefaultKey = true;
}
</code></pre>
<ul>
<li>The key come from <code>_credentialSecret</code> which is in the file <code>.config.runtime.json</code></li>
<li>Then the key is hashed as sha256 and pass to <code>decryptCredentials()</code> function</li>
<li><code>decryptCredentials()</code> extract the 32 first characters and taken them as the Initial Vector</li>
<li>The end of creds string is a base64 encoded, and the content is encrypted aes</li>
</ul>
<h2>2. Openssl is a pain</h2>
<p>The command <code>openssl enc -base64 -d</code> DOESN&#8217;T DO THE SAME AS <code>base64 -d</code></p>
<p><a class="wp-editor-md-post-content-link" href="https://stackoverflow.com/questions/35289912/openssl-enc-base64-d-does-not-decode-strings-after-a-certain-length">Why ?</a></p>
<p>Because you need <code>-A</code> one line weird option.</p>
<p><code>openssl enc -base64 -d -A</code> does the same as <code>base64 -d</code></p>
<p>So if you need to decrypt a encoded base64 payload you need the -a and -A options like</p>
<p><code>openssl enc -aes-256-ctr -d -a -A</code></p>
<p>Our key is <code>jq -j '._credentialSecret' $1/.config.runtime.json | sha256sum | cut -c 1-64</code> ( pay attention to the <code>-j</code> option of <code>jq</code> command for not passing a breakline to sha256sum).</p>
<p>Our IV is <code>jq -r '.["$"]' $1/flows_cred.json | cut -c 1-32</code>.</p>
<p>And our aes data is <code>jq '.["$"]' -j $1/flows_cred.json | cut -c 33-</code>.</p>
<h2>3. Final script</h2>
<pre><code class="language-bash ">#!/bin/bash
#
# Decrypt flows_cred.json from a NodeRED data directory
#
# Usage
# ./node-red-decrypt-flows-cred.sh ./node_red_data
#
jq '.["$"]' -j $1/flows_cred.json | \
cut -c 33- | \
openssl enc -aes-256-ctr -d -base64 -A -iv `jq -r '.["$"]' $1/flows_cred.json | cut -c 1-32` -K `jq -j '._credentialSecret' $1/.config.runtime.json | sha256sum | cut -c 1-64`
</code></pre>
</div>
<div class="section section-blog-info">
<div class="row">
<div class="col-md-6">
<div class="entry-categories">Categories: <span class="label label-primary"><a href="/en/category/news-en/">News</a></span> </div>
<div class="entry-tags">Tags: <span class="entry-tag"><a href="/en/tag/bash-en/" rel="tag">Bash</a></span><span class="entry-tag"><a href="/en/tag/flows-credential-en/" rel="tag">flows credential</a></span><span class="entry-tag"><a href="/en/tag/nodered-en/" rel="tag">NodeRED</a></span><span class="entry-tag"><a href="/en/tag/openssl-en/" rel="tag">Openssl</a></span></div> </div>
<div class="col-md-6">
<div class="entry-social">
<a target="_blank" rel="tooltip"
data-original-title="Share on Facebook"
class="btn btn-just-icon btn-round btn-facebook"
href="https://www.facebook.com/sharer.php?u=https://blog.hugopoi.net/en/2021/12/28/how-to-decrypt-flows_cred-json-from-nodered-data/">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512" width="20" height="17"><path fill="currentColor" d="M279.14 288l14.22-92.66h-88.91v-60.13c0-25.35 12.42-50.06 52.24-50.06h40.42V6.26S260.43 0 225.36 0c-73.22 0-121.08 44.38-121.08 124.72v70.62H22.89V288h81.39v224h100.17V288z"></path></svg>
</a>
<a target="_blank" rel="tooltip"
data-original-title="Share on Twitter"
class="btn btn-just-icon btn-round btn-twitter"
href="http://twitter.com/share?url=https://blog.hugopoi.net/en/2021/12/28/how-to-decrypt-flows_cred-json-from-nodered-data/&#038;text=How%20to%20decrypt%20flows_cred.json%20from%20NodeRED%20data%20%3F">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="20" height="17"><path fill="currentColor" d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"></path></svg>
</a>
<a rel="tooltip"
data-original-title=" Share on Email"
class="btn btn-just-icon btn-round"
href="mailto:?subject=How%20to%20decrypt%20flows_cred.json%20from%20NodeRED%20data%20?&#038;body=https://blog.hugopoi.net/en/2021/12/28/how-to-decrypt-flows_cred-json-from-nodered-data/">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="20" height="17"><path fill="currentColor" d="M502.3 190.8c3.9-3.1 9.7-.2 9.7 4.7V400c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V195.6c0-5 5.7-7.8 9.7-4.7 22.4 17.4 52.1 39.5 154.1 113.6 21.1 15.4 56.7 47.8 92.2 47.6 35.7.3 72-32.8 92.3-47.6 102-74.1 131.6-96.3 154-113.7zM256 320c23.2.4 56.6-29.2 73.4-41.4 132.7-96.3 142.8-104.7 173.4-128.7 5.8-4.5 9.2-11.5 9.2-18.9v-19c0-26.5-21.5-48-48-48H48C21.5 64 0 85.5 0 112v19c0 7.4 3.4 14.3 9.2 18.9 30.6 23.9 40.7 32.4 173.4 128.7 16.8 12.2 50.2 41.8 73.4 41.4z"></path></svg>
</a>
</div>
</div> </div>
<hr>
<div id="comments" class="section section-comments">
<div class="row">
<div class="col-md-12">
<div class="media-area">
<h3 class="hestia-title text-center">
0 Comments </h3>
</div>
<div class="media-body">
<div id="respond" class="comment-respond">
<h3 class="hestia-title text-center">Leave a Reply <small><a rel="nofollow" id="cancel-comment-reply-link" href="/en/2021/12/28/how-to-decrypt-flows_cred-json-from-nodered-data/#respond" style="display:none;">Cancel reply</a></small></h3><span class="pull-left author"><div class="avatar"><img src="/wp-content/themes/hestia/assets/img/placeholder.jpg" alt="Avatar placeholder" height="64" width="64"/></div></span><form action="https://blog.hugopoi.net/wp-comments-post.php" method="post" id="commentform" class="form media-body"><p class="comment-notes"><span id="email-notes">Your email address will not be published.</span> Required fields are marked <span class="required">*</span></p><div class="row"> <div class="col-md-4"> <div class="form-group label-floating is-empty"> <label class="control-label">Name <span class="required">*</span></label><input id="author" name="author" class="form-control" type="text" aria-required='true' /> <span class="hestia-input"></span> </div> </div>
<div class="col-md-4"> <div class="form-group label-floating is-empty"> <label class="control-label">Email <span class="required">*</span></label><input id="email" name="email" class="form-control" type="email" aria-required='true' /> <span class="hestia-input"></span> </div> </div>
<div class="col-md-4"> <div class="form-group label-floating is-empty"> <label class="control-label">Website</label><input id="url" name="url" class="form-control" type="url" aria-required='true' /> <span class="hestia-input"></span> </div> </div> </div>
<div class="form-group label-floating is-empty"> <label class="control-label">What&#039;s on your mind?</label><textarea id="comment" name="comment" class="form-control" rows="6" aria-required="true"></textarea><span class="hestia-input"></span> </div><p class="form-submit"><input name="submit" type="submit" id="submit" class="btn btn-primary pull-right" value="Post Comment" /> <input type='hidden' name='comment_post_ID' value='1320' id='comment_post_ID' />
<input type='hidden' name='comment_parent' id='comment_parent' value='0' />
</p><p style="display: none;"><input type="hidden" id="akismet_comment_nonce" name="akismet_comment_nonce" value="6633939105" /></p><p style="display: none !important;"><label>&#916;<textarea name="ak_hp_textarea" cols="45" rows="8" maxlength="100"></textarea></label><input type="hidden" id="ak_js" name="ak_js" value="19"/><script>document.getElementById( "ak_js" ).setAttribute( "value", ( new Date() ).getTime() );</script></p></form> </div><!-- #respond -->
</div>
</div>
</div>
</div>
</div>
</div> <div class="col-md-3 blog-sidebar-wrapper col-md-offset-1">
<aside id="secondary" class="blog-sidebar" role="complementary">
<div id="text-2" class="widget widget_text"><h5>Edito</h5> <div class="textwidget">Bienvenu sur mon blog, ici je parle de bricolage, de web (version de base). Blog perso sans prétention je poste quand j'ai le temps en plus j'aime pas écrire.</div>
</div><div id="text-6" class="widget widget_text"><h5>Hébergé gracieusement par</h5> <div class="textwidget"><div style="text-align: center"><a href="http://www.majewan.fr"><img src="/wp-content/uploads/2015/01/path22.png" alt="logo Majewan Interactive" style="width: 50%; padding: 1em;"></a></div></div>
</div><div id="custom_html-2" class="widget_text widget widget_custom_html"><h5>MASTODON</h5><div class="textwidget custom-html-widget"><a rel="me" href="https://mastodon.hugopoi.net/@hugopoi">@Hugopoi</a></div></div><div id="twitter-2" class="widget widget_twitter"><div><h5><span class='twitterwidget twitterwidget-title'>Twitter: hugopoi</span></h5><ul><li><span class='entry-content'>[Blog] How to decrypt flows_cred.json from NodeRED data ? <a href="https://t.co/CU8FYfwdq3">https://t.co/CU8FYfwdq3</a></span> <span class='entry-meta'><span class='time-meta'><a href="http://twitter.com/HugoPoi/statuses/1475611452585263112">about 7 minutes ago</a></span> <span class='from-meta'>from <a href="https://crossposter.hugopoi.net/" rel="nofollow">Mastodon To Twitter HugoPoi</a></span></span> <span class="intent-meta"><a href="http://twitter.com/intent/tweet?in_reply_to=1475611452585263112" data-lang="en" class="in-reply-to" title="Reply">Reply</a><a href="http://twitter.com/intent/retweet?tweet_id=1475611452585263112" data-lang="en" class="retweet" title="Retweet">Retweet</a><a href="http://twitter.com/intent/favorite?tweet_id=1475611452585263112" data-lang="en" class="favorite" title="Favorite">Favorite</a></span></li><li><span class='entry-content'>[Shell Hell]
This command
openssl enc -base64 -d
DOESN'T DO THE SAME AS
base64 -d
Why ?… <a href="https://t.co/9FtXX6QiJk">https://t.co/9FtXX6QiJk</a></span> <span class='entry-meta'><span class='time-meta'><a href="http://twitter.com/HugoPoi/statuses/1475419690822479875">about 12 hours ago</a></span> <span class='from-meta'>from <a href="https://crossposter.hugopoi.net/" rel="nofollow">Mastodon To Twitter HugoPoi</a></span></span> <span class="intent-meta"><a href="http://twitter.com/intent/tweet?in_reply_to=1475419690822479875" data-lang="en" class="in-reply-to" title="Reply">Reply</a><a href="http://twitter.com/intent/retweet?tweet_id=1475419690822479875" data-lang="en" class="retweet" title="Retweet">Retweet</a><a href="http://twitter.com/intent/favorite?tweet_id=1475419690822479875" data-lang="en" class="favorite" title="Favorite">Favorite</a></span></li><li><span class='entry-content'>RT <a href="http://twitter.com/NightHaunter" class="twitter-user">@NightHaunter</a>: Les enfants et la pandémie, c'est un peu comme une fable.
Une fable qui a débuté avec les masques et qui se poursuit avec…</span> <span class='entry-meta'><span class='time-meta'><a href="http://twitter.com/HugoPoi/statuses/1475383742122405892">about 15 hours ago</a></span> <span class='from-meta'>from <a href="https://github.com/TwidereProject" rel="nofollow">Twidere for Android</a></span></span> <span class="intent-meta"><a href="http://twitter.com/intent/tweet?in_reply_to=1475383742122405892" data-lang="en" class="in-reply-to" title="Reply">Reply</a><a href="http://twitter.com/intent/retweet?tweet_id=1475383742122405892" data-lang="en" class="retweet" title="Retweet">Retweet</a><a href="http://twitter.com/intent/favorite?tweet_id=1475383742122405892" data-lang="en" class="favorite" title="Favorite">Favorite</a></span></li><li><span class='entry-content'>[Blog] Do a wifi repeater with only one wifi card and Debian
<a href="https://t.co/1PQ034kJgW">https://t.co/1PQ034kJgW</a></span> <span class='entry-meta'><span class='time-meta'><a href="http://twitter.com/HugoPoi/statuses/1473333191293517827">05:43:00 PM December 21, 2021</a></span> <span class='from-meta'>from <a href="https://crossposter.hugopoi.net/" rel="nofollow">Mastodon To Twitter HugoPoi</a></span></span> <span class="intent-meta"><a href="http://twitter.com/intent/tweet?in_reply_to=1473333191293517827" data-lang="en" class="in-reply-to" title="Reply">Reply</a><a href="http://twitter.com/intent/retweet?tweet_id=1473333191293517827" data-lang="en" class="retweet" title="Retweet">Retweet</a><a href="http://twitter.com/intent/favorite?tweet_id=1473333191293517827" data-lang="en" class="favorite" title="Favorite">Favorite</a></span></li><li><span class='entry-content'>RT <a href="http://twitter.com/carm_ina" class="twitter-user">@carm_ina</a>: Allez, petit thread rapide en rapport avec les media et le traitement du porno.
Hier, une chaîne de télé m'appelle pour me f…</span> <span class='entry-meta'><span class='time-meta'><a href="http://twitter.com/HugoPoi/statuses/1471432453902544903">11:50:09 AM December 16, 2021</a></span> <span class='from-meta'>from <a href="https://about.twitter.com/products/tweetdeck" rel="nofollow">TweetDeck</a></span></span> <span class="intent-meta"><a href="http://twitter.com/intent/tweet?in_reply_to=1471432453902544903" data-lang="en" class="in-reply-to" title="Reply">Reply</a><a href="http://twitter.com/intent/retweet?tweet_id=1471432453902544903" data-lang="en" class="retweet" title="Retweet">Retweet</a><a href="http://twitter.com/intent/favorite?tweet_id=1471432453902544903" data-lang="en" class="favorite" title="Favorite">Favorite</a></span></li><li><span class='entry-content'>RT <a href="http://twitter.com/molly_struve" class="twitter-user">@molly_struve</a>: indexes can be helpful as well <a href="https://t.co/lSGnXpRqtU">https://t.co/lSGnXpRqtU</a></span> <span class='entry-meta'><span class='time-meta'><a href="http://twitter.com/HugoPoi/statuses/1470877572380643331">11:05:15 PM December 14, 2021</a></span> <span class='from-meta'>from <a href="https://github.com/TwidereProject" rel="nofollow">Twidere for Android</a></span></span> <span class="intent-meta"><a href="http://twitter.com/intent/tweet?in_reply_to=1470877572380643331" data-lang="en" class="in-reply-to" title="Reply">Reply</a><a href="http://twitter.com/intent/retweet?tweet_id=1470877572380643331" data-lang="en" class="retweet" title="Retweet">Retweet</a><a href="http://twitter.com/intent/favorite?tweet_id=1470877572380643331" data-lang="en" class="favorite" title="Favorite">Favorite</a></span></li><li><span class='entry-content'>It looks good but I think the charger is dead, only ~600mV, seems low, I read 6V is the standby output <a href="https://t.co/VP8zHZSZ31">https://t.co/VP8zHZSZ31</a></span> <span class='entry-meta'><span class='time-meta'><a href="http://twitter.com/HugoPoi/statuses/1470737097619353609">01:47:03 PM December 14, 2021</a></span> <span class='from-meta'>from <a href="https://crossposter.hugopoi.net/" rel="nofollow">Mastodon To Twitter HugoPoi</a></span></span> <span class="intent-meta"><a href="http://twitter.com/intent/tweet?in_reply_to=1470737097619353609" data-lang="en" class="in-reply-to" title="Reply">Reply</a><a href="http://twitter.com/intent/retweet?tweet_id=1470737097619353609" data-lang="en" class="retweet" title="Retweet">Retweet</a><a href="http://twitter.com/intent/favorite?tweet_id=1470737097619353609" data-lang="en" class="favorite" title="Favorite">Favorite</a></span></li><li><span class='entry-content'>RT <a href="http://twitter.com/brutofficiel" class="twitter-user">@brutofficiel</a>: "On ne peut pas dire 'J'irai en réa si je suis malade.' C'est pas possible."
À l'hôpital de Colmar, sur les 17 patients…</span> <span class='entry-meta'><span class='time-meta'><a href="http://twitter.com/HugoPoi/statuses/1470697799146737666">11:10:54 AM December 14, 2021</a></span> <span class='from-meta'>from <a href="https://github.com/TwidereProject" rel="nofollow">Twidere for Android</a></span></span> <span class="intent-meta"><a href="http://twitter.com/intent/tweet?in_reply_to=1470697799146737666" data-lang="en" class="in-reply-to" title="Reply">Reply</a><a href="http://twitter.com/intent/retweet?tweet_id=1470697799146737666" data-lang="en" class="retweet" title="Retweet">Retweet</a><a href="http://twitter.com/intent/favorite?tweet_id=1470697799146737666" data-lang="en" class="favorite" title="Favorite">Favorite</a></span></li></ul><div class="follow-button"><a href="http://twitter.com/hugopoi" class="twitter-follow-button" title="Follow @hugopoi" data-lang="en">@hugopoi</a></div></div></div><div id="categories-3" class="widget widget_categories"><h5>Catégories</h5>
<ul>
<li class="cat-item cat-item-408"><a href="/en/category/news-en/">News</a> (5)
</li>
</ul>
</div><div id="linkcat-2" class="widget widget_links"><h5>Blogs et Infos</h5>
<ul class='xoxo blogroll'>
<li><a href="http://blog.rom1v.com" title="Découverte récente, publication de qualité">®om&#039;s blog</a></li>
<li><a href="http://bluetouff.com" title="Un blog hacktiviste avec des idées et des compétences pas comme les autres." target="_blank">☠ Bluetouff</a></li>
<li><a href="http://www.korben.info/" title="Upgrade your Mind" target="_blank">Korben</a></li>
<li><a href="http://www.laquadrature.net/fr" title="La Quadrature du Net Fr" target="_blank">La Quadrature du Net</a></li>
<li><a href="https://www.nextinpact.com/" title="Actualité Informatique" target="_blank">NextInpact</a></li>
<li><a href="http://pixellibre.net/" title="Un petit blog de geek comme on les aime avec du hadopi, de l&#8217;info et du troll" target="_blank">Pixel Libre.net</a></li>
<li><a href="http://reflets.info" title="Reflets.info fait le pari de devenir le reflet dune société, des individus qui la composent." target="_blank">Reflets</a></li>
<li><a href="http://blog.spyou.org/wordpress-mu/" rel="acquaintance" title="Fabriquer son internet" target="_blank">Turb(l)o(g)</a></li>
</ul>
</div>
<div id="linkcat-76" class="widget widget_links"><h5>Podcast</h5>
<ul class='xoxo blogroll'>
<li><a href="http://www.nowatch.net/category/nowatch-net/nowatch-fm/appload-nowatch-fm/" title="Des Apps pour votre mobile (un peu sponsorisé par Apple mais il y a du Android aussi)" target="_blank">AppLoad</a></li>
<li><a href="http://freepod.net/" title="Libère ton podcast, regroupement de podcast." target="_blank">Freepod</a></li>
<li><a href="http://www.geekinc.fr/" title="On partage la culture geek ! (sponsorisé par Apple mais j&#8217;aime bien quand même)" target="_blank">GeekInc</a></li>
<li><a href="http://www.captainweb.net/" title="Podcast déjanté de l&#8217;actu web, super ambiance !" target="_blank">L&#039;Apéro du Captainweb</a></li>
<li><a href="http://www.lagrottedubarbu.com/" title="Hack the technologie" target="_blank">La Grotte du Barbu</a></li>
<li><a href="http://www.poligeek.fr/" title="&#8220;Un jour les geek domineront le monde, mais pas demain, ya une keynote de Steve Jobs&#8221;" target="_blank">PoliGeek</a></li>
<li><a href="http://quadratour.net/" title="Pour les vieux Geeks de l&#8217;apocalypse…" target="_blank">Quadratour</a></li>
</ul>
</div>
</aside><!-- .sidebar .widget-area -->
</div>
</div>
</article>
</div>
</div>
</div>
<div class="section related-posts">
<div class="container">
<div class="row">
<div class="col-md-12">
<h2 class="hestia-title text-center">Related Posts</h2>
<div class="row">
<div class="col-md-4">
<div class="card card-blog">
<div class="content">
<h6 class="category text-info"><a href="/en/category/news-en/" title="View all posts in News" >News</a> </h6>
<h4 class="card-title">
<a class="blog-item-title-link" href="/en/2021/12/21/do-a-wifi-repeater-with-only-one-wifi-card-and-debian/" title="Do a wifi repeater with only one wifi card and Debian" rel="bookmark">
Do a wifi repeater with only one wifi card and Debian </a>
</h4>
<p class="card-description">Summary I wanted to extend the range of an existing wifi access point without cables or changing the configuration. It&#8217;s a temporary installation, and I doesn&#8217;t want do buy more hardware and use what I<a class="moretag" href="/en/2021/12/21/do-a-wifi-repeater-with-only-one-wifi-card-and-debian/"> Read more&hellip;</a></p>
</div>
</div>
</div>
<div class="col-md-4">
<div class="card card-blog">
<div class="content">
<h6 class="category text-info"><a href="/en/category/news-en/" title="View all posts in News" >News</a> </h6>
<h4 class="card-title">
<a class="blog-item-title-link" href="/en/2020/04/29/my-shitty-nvidia-displayport-problems-who-no-ones-care-about/" title="My shitty Nvidia DisplayPort Problems who no ones care about" rel="bookmark">
My shitty Nvidia DisplayPort Problems who no ones care about </a>
</h4>
<p class="card-description">Recently I have done the acquisition of a new ULTRAWIDE screen, precisily a Philips 439PH9 with a DisplayPort v1.4, this information is very important for what&#8217;s coming next. The problem The morning I receive it,<a class="moretag" href="/en/2020/04/29/my-shitty-nvidia-displayport-problems-who-no-ones-care-about/"> Read more&hellip;</a></p>
</div>
</div>
</div>
<div class="col-md-4">
<div class="card card-blog">
<div class="card-image">
<a href="/en/2020/04/11/how-to-backup-freenas-zvol-to-s3-storage/" title="How to backup FreeNas zvol to S3 storage">
<img width="360" height="240" src="/wp-content/uploads/2020/04/IMG_20200411_171114-360x240.jpg" class="attachment-hestia-blog size-hestia-blog wp-post-image" alt="" loading="lazy" /> </a>
</div>
<div class="content">
<h6 class="category text-info"><a href="/en/category/news-en/" title="View all posts in News" >News</a> </h6>
<h4 class="card-title">
<a class="blog-item-title-link" href="/en/2020/04/11/how-to-backup-freenas-zvol-to-s3-storage/" title="How to backup FreeNas zvol to S3 storage" rel="bookmark">
How to backup FreeNas zvol to S3 storage </a>
</h4>
<p class="card-description">Context I have a FreeNAS setup I want a cheap offsite backup solution Backblaze only offer S3 storage solution I have virtual machines on zvol to backup (not just files) ZFS send/receive is very convenient<a class="moretag" href="/en/2020/04/11/how-to-backup-freenas-zvol-to-s3-storage/"> Read more&hellip;</a></p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="footer-wrapper">
<footer class="footer footer-black footer-big">
<div class="container">
<div class="hestia-bottom-footer-content"><ul class="footer-menu pull-left"></ul>
<div class="copyright pull-right">
Hestia | Developed by <a href="https://themeisle.com" rel="nofollow">ThemeIsle</a> </div>
</div> </div>
</footer>
</div>
</div>
<button class="hestia-scroll-to-top">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512" width="12.5px" height="20px"><path d="M177 255.7l136 136c9.4 9.4 9.4 24.6 0 33.9l-22.6 22.6c-9.4 9.4-24.6 9.4-33.9 0L160 351.9l-96.4 96.4c-9.4 9.4-24.6 9.4-33.9 0L7 425.7c-9.4-9.4-9.4-24.6 0-33.9l136-136c9.4-9.5 24.6-9.5 34-.1zm-34-192L7 199.7c-9.4 9.4-9.4 24.6 0 33.9l22.6 22.6c9.4 9.4 24.6 9.4 33.9 0l96.4-96.4 96.4 96.4c9.4 9.4 24.6 9.4 33.9 0l22.6-22.6c9.4-9.4 9.4-24.6 0-33.9l-136-136c-9.2-9.4-24.4-9.4-33.8 0z"></path></svg>
</button>
<!-- Matomo -->
<script type="text/javascript">
var _paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="//blog.hugopoi.net/wp-content/plugins/wp-piwik/proxy/"
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '1']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.type='text/javascript'; g.async=true; g.defer=true; g.src=u+'matomo.php'; s.parentNode.insertBefore(g,s);
})();
</script>
<!-- End Matomo Code -->
<script type='text/javascript' src='/wp-content/plugins/wp-syntax/js/wp-syntax.js?ver=1.1' id='wp-syntax-js-js'></script>
<script type='text/javascript' src='/wp-includes/js/comment-reply.min.js?ver=5.8.2' id='comment-reply-js'></script>
<script type='text/javascript' src='/wp-content/themes/hestia/assets/bootstrap/js/bootstrap.min.js?ver=1.0.2' id='jquery-bootstrap-js'></script>
<script type='text/javascript' src='/wp-includes/js/jquery/ui/core.min.js?ver=1.12.1' id='jquery-ui-core-js'></script>
<script type='text/javascript' id='hestia_scripts-js-extra'>
/* <![CDATA[ */
var requestpost = {"ajaxurl":"https:\/\/blog.hugopoi.net\/wp-admin\/admin-ajax.php","disable_autoslide":"","masonry":""};
/* ]]> */
</script>
<script type='text/javascript' src='/wp-content/themes/hestia/assets/js/script.min.js?ver=3.0.20' id='hestia_scripts-js'></script>
<script type='text/javascript' src='/wp-includes/js/wp-embed.min.js?ver=5.8.2' id='wp-embed-js'></script>
<script type='text/javascript' src='https://platform.twitter.com/widgets.js?ver=1.0.0' id='twitter-widgets-js'></script>
</body>
</html>