<!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 ? – 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 » Feed" href="/en/feed/" /> <link rel="alternate" type="application/rss+xml" title="HugoPoi » Comments Feed" href="/en/comments/feed/" /> <link rel="alternate" type="application/rss+xml" title="HugoPoi » 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&subset=latin%2Clatin-ext&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&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’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/&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?&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'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>Δ<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'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’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 d’une 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’aime bien quand même)" target="_blank">GeekInc</a></li> <li><a href="http://www.captainweb.net/" title="Podcast déjanté de l’actu web, super ambiance !" target="_blank">L'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="“Un jour les geek domineront le monde, mais pas demain, y’a une keynote de Steve Jobs”" target="_blank">PoliGeek</a></li> <li><a href="http://quadratour.net/" title="Pour les vieux Geeks de l’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’s a temporary installation, and I doesn’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…</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’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…</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…</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>