{"id":10190,"date":"2013-03-18T18:08:17","date_gmt":"2013-03-18T17:08:17","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=10190"},"modified":"2013-05-14T17:05:39","modified_gmt":"2013-05-14T15:05:39","slug":"t113-uso-della-crittografia-nelle-applicazioni-iphone-e-ipad-con-rncryptor-parte-1","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/t113-uso-della-crittografia-nelle-applicazioni-iphone-e-ipad-con-rncryptor-parte-1\/","title":{"rendered":"T#113 \u2013 Uso della crittografia nelle applicazioni iPhone e iPad con RNCryptor &#8211; Parte 1"},"content":{"rendered":"<p>In questo nuovo tutorial mostreremo come \u00e8 possibile usare facilmente le librerie di crittografia <strong>CommonCrypto<\/strong> di Apple, mediante delle API sviluppate da Rob Napier e messe a disposizione su un repository github. Il tutorial \u00e8 una demo app che fa vedere in modo semplice come \u00e8 possibile crittografare e decifrare un messaggio con una password. Il progetto \u00e8 aggiornato alla versione Xcode 4.6. Ringraziamo lo sviluppatore <a href=\"http:\/\/www.megabri.com\" target=\"_blank\">Gabriele Merlonghi<\/a>, creatore delle applicazioni <a href=\"http:\/\/clk.tradedoubler.com\/click?p=24373&#038;a=1735897&#038;g=0&#038;url=https:\/\/itunes.apple.com\/it\/app\/fast-tutor\/id532463469?mt=8&#038;partnerId=2003\" target=\"_blank\">Fast &#038; Tutor<\/a> e <a href=\"http:\/\/clk.tradedoubler.com\/click?p=24373&#038;a=1735897&#038;g=0&#038;url=https:\/\/itunes.apple.com\/it\/app\/gps-alarm-pro\/id435336524?mt=8&#038;partnerId=2003\" target=\"_blank\">GPS Alarm Pro<\/a> (che potete trovare su App Store), il quale ci ha concesso la pubblicazione di questa utilissima guida.<\/p>\n<p>La prima cosa da dire \u00e8 che <strong>RNCryptor<\/strong> non contiene gli algoritmi di crittografia, ma si interpone tra essi (contenuti nel Security.framework) e voi che volete usarli.<br \/>\nLa mia curiosit\u00e0 \u00e8 stata quella di voler capire come fare a scambiare dei dati cifrati tra 2 device, di cui almeno uno \u00e8 un iOS. Conoscevo gi\u00e0 il potente e decantato algoritmo AES, ma quando mi sono imbattuto googlando su RNCryptor ho scoperto che l&#8217;AES \u00e8 solo una parte del lavoro da fare. In verit\u00e0 per fare un sistema di questo genere c&#8217;\u00e8 da considerare oltre che la cifratura dei dati in se, anche aspetti legati al trattamento delle password, il vettore di inizializzazione, il padding e la signature.<!--more--><\/p>\n<p>Se si parte dall&#8217;ipotesi di avere un device A e un device B tra cui scambiare messaggi cifrati e si ha in mano l&#8217;implementazione su entrambi i device, tutti questi aspetti sopra esposti possono sembrare opzionali, nel senso che si pu\u00f2 pensare di scegliere una soluzione anche molto basilare per proteggere i messaggi. Tuttavia, dopo l&#8217;approfondimento che ho eseguito, ho dedotto che non \u00e8 cos\u00ec.<\/p>\n<p>Vi riporto letteralmente una conversazione che ho avuto direttamente con Rob Napier:<\/p>\n<blockquote><p>&#8220;What is your goal with this encryption? If you are trying to hide the traffic from someone who has both devices, they can just jailbreak the phone and read it after decryption. If you have a hard-coded password anywhere in the iPhone software, then they can pull that out and decryption is then trivial. So what problem are you trying to solve? Who is your attacker and what is their goal? You can&#8217;t secure a system without knowing these things.<\/p>\n<p>Rob&#8221;<\/p><\/blockquote>\n<p>Tradotto:<\/p>\n<ul>\n<li>Qual \u00e8 l&#8217;obiettivo di questa encryption?<\/li>\n<li>Se tu stai tentando di nascondere il traffico tra 2 punti da qualcuno che ha entrambi i devices, questi possono jailbrekkare l&#8217;iPhone e leggere il messaggio dopo che \u00e8 stato decifrato.<\/li>\n<li>Se tu hai una password embeddata da qualche parte nella tua applicazione, (sempre tramite il jailbreak) questa pu\u00f2 essere letta e quindi poi decifrare i messaggi sar\u00e0 un gioco da ragazzi<\/li>\n<li>Quindi, qual \u00e8 il problema che stai tentando di risolvere ?<\/li>\n<li>Chi sono i tuoi avversari negli attacchi e quali sono i loro obiettivi ?<\/li>\n<li>Non puoi proteggere un sistema senza sapere queste cose.<\/li>\n<\/ul>\n<p>Mi ritrovo completamente con queste affermazioni, anche se sono molto &#8220;pesanti&#8221; e non hanno una soluzione univoca per qualsiasi sistema. Tutto ci\u00f2 per dare una idea di quanto realmente potrebbe essere complessa e piena di &#8220;sfumature&#8221; una soluzione di protezione informatica.<\/p>\n<p>Le principali linee guida che hanno portato allo sviluppo di RNCryptor sono riassunte in <a href=\"http:\/\/robnapier.net\/blog\/aes-commoncrypto-564\" target=\"_blank\">questo articolo<\/a> di Rob Napier sul suo blog, \u00e8 molto interessante e vi consiglio di leggervelo.<\/p>\n<p>Adesso andiamo sul concreto e cerchiamo di capire cosa fa questo cuscinetto tra noi e le CommonCrypto che si chiama RNCryptor.<\/p>\n<p>Questo da una interfaccia in Objective-C facile da usare verso le funzioni di crittografia AES, occupandosi di vari aspetti quali quelli di:<\/p>\n<ol>\n<li>password stretching: stiramento della password tramite l&#8217;algoritmo PBKDF2<\/li>\n<li>salting: letteralmente &#8220;mettere il sale&#8221; ovvero dati random<\/li>\n<li>IV: vettore di inizializzazione<\/li>\n<li>HMAC: controllo di integrit\u00e0 del messaggio e firma<\/li>\n<\/ol>\n<p>Ci sono semplicemente 2 metodi RNEncryptor, RNDecryptor che provvedono a scrivere e leggere il messaggio in un formato definito da Rob Napier ovvero in  RNCryptor data format.<\/p>\n<p>RNCryptor contiene anche una interfaccia verso il formato OpenSSL (metodi RNOpenSSLEncryptor, RNOpenSSLDecryptor) ma questo formato non \u00e8 raccomandabile perch\u00e9 secondo Napier manca di alcuni aspetti di sicurezza. E&#8217; presente in RNCryptor solo a scopo di compatibilit\u00e0. Questo aspetto non \u00e8 trattato nel presente tutorial perch\u00e9 non \u00e8 stato da me approfondito al momento.<br \/>\nNella documentazione di RNCryptor sono riportati 2 esempi d&#8217;uso: uno sincrono e l&#8217;altro asincrono. Nel presente tutorial \u00e8 stato effettuato solo l&#8217;esempio sincrono.<\/p>\n<h3>L&#8217;algoritmo AES Rijndael<\/h3>\n<p>La storia recita che l&#8217;algoritmo Rijndael divenne l&#8217;Advanced Encryption Standard (AES) a seguito di una selezione tra vari algoritmi per ben 5 anni di studi. Nel novembre del 2001 il NIST lo scelse come standard di riferimento per cifratura.<\/p>\n<p>Non mi dilungo sugli aspetti tecnico-matematici dell&#8217;algoritmo, perch\u00e9 <a href=\"http:\/\/it.wikipedia.org\/wiki\/Advanced_Encryption_Standard\" target=\"_blank\">qui<\/a> (su wikipedia) trovate un adeguato approfondimento.<\/p>\n<p>Vorrei sottolineare solo gli aspetti che secondo me sono pi\u00f9 rappresentativi:<\/p>\n<ol>\n<li>l&#8217;AES \u00e8 molto sicuro perch\u00e9 non \u00e8 stato ancora mai bucato, ci sono solo studi teorici di possibili attacchi che risultano al momento non realizzabili in pratica<\/li>\n<li>l&#8217;AES \u00e8 molto veloce perch\u00e9 ha una matematica relativamente semplice, e per questo risulta facilmente implementabile anche su microcontrollori 8 bit, ottenendo dei buoni risultati prestazionali<\/li>\n<li>l&#8217;AES \u00e8 molto compatto, solo qualche Kbytes di codice per la sua implementazione<\/li>\n<\/ol>\n<p>L&#8217;AES ha come principale caratteristica quella di essere un algoritmo di cifratura a blocchi con lunghezza fissa di 128bit (16 bytes). La lunghezza della chiave pu\u00f2 essere di 3 tipi: 128, 192 o 256 bit. In questo tutorial \u00e8 stato scelto di usare la lunghezza di 128 bit della chiave.<\/p>\n<p>Cifrare a blocchi di 16bytes va bene, ma come si gestisce il flusso di cifratura di tutto un messaggio che ovviamente pu\u00f2 essere maggiore di questa dimensione ?<\/p>\n<p>Ebbene ci sono 3 aspetti molto importanti da considerare:<\/p>\n<ol>\n<li>la modalit\u00e0 di funzionamento di un cifrario a blocchi<\/li>\n<li>il vettore di inizializzazione<\/li>\n<li>il padding dell&#8217;ultimo blocco<\/li>\n<\/ol>\n<p>Questi aspetti vengono spiegati nei successivi paragrafi.<\/p>\n<h3>La modalit\u00e0 di funzionamento di un cifrario a blocchi<\/h3>\n<p>Ci sono varie tecniche pi\u00f9 o meno sicure, ma quella certamente pi\u00f9 sconsigliata (perch\u00e9 altamente insicura) \u00e8 in verit\u00e0 quella che ci verrebbe pi\u00f9 naturale di pensare: scompongo il messaggio a blocchi di 16bytes e cifro ad uno ad uno tutti i blocchi con la stessa chiave.<\/p>\n<p>Questa modalit\u00e0 \u00e8 chiamata ECB (Electronic Codebook) e questa immagine rende bene l&#8217;idea del perch\u00e9 \u00e8 insicura:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/03\/t113-crittografia-ios-app-con-RNCryptor-02-300x165.png.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/03\/t113-crittografia-ios-app-con-RNCryptor-02-300x165.png.png\" alt=\"t113-crittografia-ios-app-con-RNCryptor-02-300x165.png\" width=\"550\" height=\"303\" class=\"aligncenter size-full wp-image-10198\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/03\/t113-crittografia-ios-app-con-RNCryptor-02-300x165.png.png 619w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/03\/t113-crittografia-ios-app-con-RNCryptor-02-300x165.png-300x165.png 300w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>La modalit\u00e0 pi\u00f9 sicura \u00e8 solo leggermente pi\u00f9 complicata, si chiama CBC (Cipher Block Chaining) e consiste semplicemente nell&#8217;introdurre un passaggio in pi\u00f9 di XOR tra il blocco in chiaro e il risultato del blocco cifrato al passaggio precedente.<\/p>\n<p>Questa immagine descrive perfettamente quanto esposto:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/03\/t113-crittografia-ios-app-con-RNCryptor-03.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/03\/t113-crittografia-ios-app-con-RNCryptor-03.png\" alt=\"t113-crittografia-ios-app-con-RNCryptor-03\" width=\"550\" height=\"223\" class=\"aligncenter size-full wp-image-10200\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/03\/t113-crittografia-ios-app-con-RNCryptor-03.png 600w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/03\/t113-crittografia-ios-app-con-RNCryptor-03-300x121.png 300w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/a><br \/>\n<\/center><\/p>\n<h3>Il vettore di inizializzazione<\/h3>\n<p>La modalit\u00e0 CBC \u00e8 quella implementata in RNCryptor, ma questa fa nascere un altro problema: quando si cifra il primo blocco, cosa occorre scegliere in ingresso all\u2019operazione di XOR dato che non \u00e8 stata fatta alcuna iterazione precedente ?<\/p>\n<p>La risposta \u00e8 il vettore di inizializzazione, ma come lo scelgo ?<\/p>\n<p>La cosa pi\u00f9 sicura da fare \u00e8 generare una sequenza casuale di 16 byte ed utilizzarla come IV. Ovviamente per poter essere decifrato correttamente il messaggio, occorre trasportare nel payload stesso (in chiaro) anche l\u2019IV usato in questa fase di cifratura oltre che il risultato della cifratura, ma questo non rappresenta un problema di sicurezza.<br \/>\nL&#8217;uso di un IV predeterminato e quindi costante \u00e8 insicuro ed altamente sconsigliato. <a href=\"http:\/\/en.wikipedia.org\/wiki\/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29\" target=\"_blank\">Qui<\/a> l&#8217;articolo di wikipedia che spiega in dettaglio le principali modalit\u00e0 di funzionamento a blocchi.<\/p>\n<h3>Il padding dell\u2019ultimo blocco<\/h3>\n<p>Non ci sono ragioni legate alla sicurezza, ma solo una ottima tecnica facilmente implementabile e autoconsistente anche in fase di decrypt, alla base della scelta dell&#8217;algoritmo PKCS#7.<br \/>\nIn pratica quando l&#8217;ultimo blocco dati da cifrare risulta inferiore di 16bytes si aggiungono un numero di byte in modo da riempirlo e tutti con un valore uguale al numero di byte aggiunti.<\/p>\n<p><strong>ESEMPIO:<\/strong> se l&#8217;ultimo blocco dati risulta da 10 byte, si aggiungono 6 byte tutti con il valore 0x06.<br \/>\nNel caso particolare che l&#8217;ultimo blocco dati fitta perfettamente in 16bytes, allora si aggiunge alla catena di cifratura un intero altro blocco da 16 bytes aventi tutti valore 0x10.<br \/>\nCos\u00ec facendo \u00e8 facile intuire come in fase di decrypt occorre scartare gli ultimi bytes che non fanno parte quindi del messaggio originale.<\/p>\n<p><a href=\"http:\/\/en.wikipedia.org\/wiki\/Padding_%28cryptography%29\" target=\"_blank\">Qui<\/a> \u00e8 l&#8217;articolo di wikipedia che spiega il padding nella crittografia.<\/p>\n<h3>Password Stretching &#038; Salting<\/h3>\n<p>L&#8217;algoritmo AES \u00e8 alla base del motore crittografico, ma abbiamo visto come questo ha il vincolo che la chiave \u00e8 di una dimensione prefissata ben precisa (nel tutorial \u00e8 stato scelto 128 bit = 16 bytes).<\/p>\n<p>Inoltre \u00e8 irragionevole pensare che una persona umana, inserisca mnemonicamente una numerazione esadecimale di 16 valori per cifrare e decifrare un messaggio.<\/p>\n<p>Queste semplici considerazioni sono alla base delle definizioni di &#8220;key&#8221; e di &#8220;password&#8221;.<\/p>\n<p>La key \u00e8 la chiave a 128 bit usata fisicamente per l&#8217;algoritmo di cifratura, mentre la password \u00e8 la frase mnemonica che un utente pu\u00f2 digitare ed \u00e8 umanamente facile da ricordare.<\/p>\n<p>Quindi si pone il problema di come trasformare una password generica e originalmente in formato NSString in una key dalla lungezza fissa. Per fortuna ci viene in aiuto l\u2019algorimo di password stretching (stiramento) denominato PBKDF2 che letteralmente significa Password-Based Key Derivation Function 2.<\/p>\n<p>Anche in questo caso non mi dilungo sui dettagli tecnico-matematici che si possono approfondire leggendo <a href=\"http:\/\/en.wikipedia.org\/wiki\/PBKDF2\" target=\"_blank\">questo articolo<\/a> su wikipedia. Mi limito per\u00f2 a indicare gli aspetti essenziali:<\/p>\n<ol>\n<li>un algoritmo di password stretching \u00e8 veramente molto affascinante, perch\u00e9 puoi definire come password una stringa di qualsiasi lunghezza e qualsiasi carattere e questo la stira allungandola o riducendola per farla fittare sempre nella lunghezza prefissata (16 bytes nel nostro caso)<\/li>\n<li>una password &#8220;umana&#8221; pu\u00f2 essere facilmente attaccabile per tentativi mediante l\u2019uso di un database di password pi\u00f9 famose. Per proteggersi da questo tipo di attacco \u00e8 fondamentale utilizzare il salt (letteralmente &#8220;salatura&#8221;) che consiste nell&#8217;indicare al PBKDF2 un certo numero di bytes random (in RNCryptor sono previsto 8 bytes) che l&#8217;algoritmo provveder\u00e0 a mescolare insieme alla password originale per generare quindi la key. Ovvio che per ricostruirsi la stessa key in fase di decrypt occorre conoscere il &#8220;salt&#8221; utilizzato in origine. Anche questo (come per l&#8217;IV) transiter\u00e0 in chiaro insieme al messaggio cifrato.<\/li>\n<li>un parametro da non sottovalutare \u00e8 il numero di iterazioni che l&#8217;algoritmo pu\u00f2 fare per derivare la key. Per avere una elevata sicurezza, Rob Napier consiglia di usare 10000 iterazioni ed infatti questo valore \u00e8 preimpostato nella struttura di configurazione di RNCrypto che vedremo pi\u00f9 avanti.<\/li>\n<\/ol>\n<p><a href=\"http:\/\/en.wikipedia.org\/wiki\/PBKDF2\" target=\"_blank\">Qui<\/a> trovate l&#8217;articolo di wikipedia che spiega in dettaglio l&#8217;algoritmo PBKDF2<\/p>\n<p>E&#8217; importante osservare che essendo il salt e l&#8217;IV dati random, una molteplice cifratura dello stesso messaggio di origine porta ad avere rispettivi messaggio cifrati mai uguali tra loro. Questo rafforza notevolmente la sicurezza.<\/p>\n<p><a href=\"http:\/\/anandam.name\/pbkdf2\/\" target=\"_blank\">Questo<\/a> \u00e8 un interessante portale in cui \u00e8 implementato in javascript l&#8217;algorito di derivazione delle chiavi PBKDF2. Molto utile per verificare se la vostra implementazione \u00e8 corretta. Fate attenzione, perch\u00e8 non \u00e8 scritto esplicitamente, ma i campi (password e salt) sono trattati come ASCII e non come binari.<\/p>\n<h3>HMAC<\/h3>\n<p>L&#8217;HMAC \u00e8 un codice di autenticazione del messaggio (Message Autentication Code) e pu\u00f2 essere utilizzato per verificare sia l&#8217;integrit\u00e0 che l&#8217;autenticazione di un messaggio. Si tratta di un algoritmo di hashing con una chiave segreta. Come con qualsiasi MAC, esso pu\u00f2 essere utilizzato con normale funzione hash, come MD5 o SHA-1, che si traduce in metodi come HMAC-MD5 o HMAC-SHA1. Come con qualsiasi funzione di hashing, la forza dipende dalla qualit\u00e0 della funzione di hashing, e il risultante numero di bit di codice. <\/p>\n<p>Nel presente tutorial si \u00e8 scelto di usare l&#8217;algoritmo HMAC-SHA1 che ha la caratteristica di avere 20 bytes di uscita. La lunghezza della chiave utilizzata \u00e8 pari a 16 bytes come anche per la cifratura, ma \u00e8 diversa, nel senso che viene derivata dalla stessa password iniziale, ma con un salt randomico, quindi differente. Per questo motivo quindi le key derivate sono in totale 2, una usata per l&#8217;encryption e l&#8217;altra per l&#8217;HMAC.<\/p>\n<p>L&#8217;hashing viene fatto dell&#8217;intero payload della struttura dati d\u2019uscita dell&#8217;RNCrypt e i 20 bytes vengono accodati andando a costituire cos\u00ec il pacchetto finale.<br \/>\nL&#8217;HMAC non modificare il messaggio cifrato, ma ha lo scopo di essere utilizzato prima della fase di decrypt per validare il messaggio entrante.<br \/>\n<a href=\"http:\/\/www.asecuritysite.com\/security\/Encryption\/hmac\" target=\"_blank\">Questo<\/a> \u00e8 un interessante portale in cui sono implementati vari algoritmi di HMAC. Molto utile per verificare se la vostra implementazione \u00e8 corretta.<\/p>\n<h3>Conclusioni<\/h3>\n<p>Con la teoria, e per oggi, \u00e8 tutto. Nella prossima parte di questa guida vedremo un esempio pratico di implementazione di crittografia nelle nostre app iOS con RBCryptor.<br \/>\nUn ringraziamento alla redazione di devAPP per avermi dato la possibilit\u00e0 di pubblicare questo tutorial sul questo blog. Non dimenticatevi di accedere anche al mio blog personale <a href=\"http:\/\/www.megabri.com\" target=\"_blank\">http:\/\/www.megabri.com<\/a> e al portale delle mie App <a href=\"http:\/\/www.mgproductions.it\" target=\"_blank\">http:\/\/www.mgproductions.it<\/a>.<\/p>\n<p>Gabriele Merlonghi<\/p>\n<p><center><\/p>\n<h3>Vuoi ringraziare l&#8217;autore di questa guida?<br \/>\nOffrigli un caff\u00e8 scaricando <a href=\"http:\/\/clk.tradedoubler.com\/click?p=24373&#038;a=1735897&#038;g=0&#038;url=https:\/\/itunes.apple.com\/it\/app\/fast-tutor\/id532463469?mt=8&#038;partnerId=2003\" target=\"_blank\">la sua applicazione<\/a> \ud83d\ude42<\/h3>\n<p><a href=\"http:\/\/clk.tradedoubler.com\/click?p=24373&#038;a=1735897&#038;g=0&#038;url=https:\/\/itunes.apple.com\/it\/app\/fast-tutor\/id532463469?mt=8&#038;partnerId=2003\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/03\/Banner-Fast-And-Tutor.png\" alt=\"Banner-Fast-And-Tutor\" width=\"468\" height=\"60\" class=\"aligncenter size-full wp-image-10214\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/03\/Banner-Fast-And-Tutor.png 468w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/03\/Banner-Fast-And-Tutor-300x38.png 300w\" sizes=\"auto, (max-width: 468px) 100vw, 468px\" \/><\/a><br \/>\n<\/center><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In questo nuovo tutorial mostreremo come \u00e8 possibile usare facilmente le librerie di crittografia CommonCrypto di Apple,&#8230;<\/p>\n","protected":false},"author":529,"featured_media":10469,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[1264,1266,413,1265],"class_list":["post-10190","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorial-pratici","tag-commoncrypto","tag-crittografia-applicazione-iphone-ipad","tag-programmare-iphone","tag-rncryptor-ios"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/10190","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/users\/529"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=10190"}],"version-history":[{"count":22,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/10190\/revisions"}],"predecessor-version":[{"id":10471,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/10190\/revisions\/10471"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media\/10469"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=10190"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=10190"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=10190"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}