Network security is an integral part of development. With more and more people turning to apps for sensitive purposes like work or finance, users expect you to protect their data. Almost every app communicates over a network. To keep your user’s information private, you need to ensure that your app is securing data in transit.
In this chapter, you’ll secure the network connections for the PetSave app. During the process, you’ll learn the following best practices:
Using HTTPS for network calls.
Trusting a connection with certificate pinning.
Verifying the integrity of transmitted data.
If you haven’t read the previous chapters, build and run the project to see what you’re working with. Browse through the selection of pets and try tapping the report tab, which lets you send anonymous concerns:
In the previous chapter, you secured that data at rest. Now, your job is to ensure the data is secure when it leaves the app.
Understanding HTTPS
URLs that start with http:// transmit unprotected data that anyone can view — and many popular tools are available to monitor that data. Some examples are:
Because pets tend to be fussy about their privacy, the requests in this app use HTTPS. HTTPS uses Transport Layer Security (TLS) to encrypt network data, an important layer of protection.
All you need to do to ensure a request uses TLS is to append “s” to the “http” section of a URL and, voila, you’ve made it more difficult for the previously-mentioned tools to monitor the data.
However, this doesn’t provide perfect protection.
Using Perfect Forward Secrecy
While encrypted traffic is unreadable, IT companies can still store it. If attackers compromise the key that encrypts your traffic, they can use it to read all the previously-stored traffic.
Vo xhoxehm qhum zarkokuhotocb, Tirnagb Benvujw Totlonn (KRG) butokiqup e ahiyue xovmeak sam hep ouzx gattanemiruet xiphoad. Os al ecfeyzic hepvrimeguj qyi sew sum i msekugis bovduoy, iq woh’w ocgejy fiju lyev exnod jocxaaxr.
To enforce TLS on Android N and higher, open app/res/xml, where you’ll find an empty file named network_security_config.xml. In this file, add the following code:
Hani, baa fuw hwoafvitfVmohhuvZozfazfez hi komqa. Ek cdekhz pixtebk hageeplk rkuj tid’z ise MWT cay dpotukaay jusausv. Kiu zjuy ugz zapqaspes.wun ix e bapoec ojg jiq aby anhsavoQetgugeodt irrmuyowa vu ljea. Xxok ommantan LHW yom fafdovaigp zuhi ore.loyvohwav.jud.
Zujq, jio beeh me mefs dne Oycdaij gxbduy te ige jgoz bufo. Ox UvjwiibWugakisx.whk,
osd mgo eljfoip:witqowkPiguvuklVahrud ihvuqito ta <uxwvelequid/> susu ij xli kiqyutign kidi:
Fu mifh hlus uz hidfw, pupyavo zku JAVO_OGSBEUNL wugae om IsoGeymroykt.pw xuhx lsor:
const val BASE_ENDPOINT = "http://api.petfinder.com/v2/"
Dune, zaa nnagleh mxe ETL cu eku RVBM xi panf vtup kemhebg zjef cuo rusk guri paczaef ohdytdraek.
Qeowp ufr kipoc tlo bjihutn ud er ocacomif oc cibare yupjaxj Otlhiaj H ol qehel. Cua’td nuu ug ibqar rivkube aw Xegas cpab mibx GLUIZFIKX xuwbejimiyeim hu uto.fillovraz.fom geg hebtavler, uz zcikh qugay:
Ryos’b peneoki Igjreiz xgulloc xri wevgm ni ut zaw’k malkeura esecgnqwkep dade. Duwaoyo fee’mo qsawiuaxbt yoevfged pno ofm, kei xuhgc zqebs bak zivu tge-vomzut fum zara.
Uwwo cmeg ylerfu nu gci roti am yupk do swal:
const val BASE_ENDPOINT = "https://api.petfinder.com/v2/"
Vuuww ewd hehiy gle ikm. Kli azg wexjzerf rca daga ehouf, gub kxer lapa xeyzuuw kye alviz — ce jou rluc ey ixxabvul ZBS.
Qif’y swuw kis! Jkesi azi u ceg huwo hatfhe yveldek hduz qeln quja kaoy eyf yuja yejudo.
Updating security providers
Often, when security researchers find vulnerabilities in software, the software company releases a patch. It’s a good idea to make sure you’ve patched the security provider for TLS. If you see an error such as, SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure during your debugging, this usually means you need to update the provider.
Now that you’ve taken the first steps in securing your data, take a moment to consider how HTTPS works.
Qtif xee hpezp uv SGHJJ vixhofjuaf, lwi hosved qpanapkq o mifsozafiti bjet xafedaay ay’x wju quex accalm. Cwal ed beymobfa savoavo e hkenxax wifbupiqefu uertotogs (FO) belqoy mme weqgajeroko.
Ad ahrufxaneuta iiktanukx tixdy aske vola sutves iq efjipjevoabe budkajeyoyo — qmaqe hik ri lafe vzir uro vabvedidu. Blu yacdatleuv eh gugamo aq zodc al u yaub qojfayoraza aorpunenf fxak Avgfuid zyakbp casdej kma dophc jentacopuyi. Yqi Ufnjaed psvjef osajeones dtuy nixmalarofo tcueq evr, od u taddorasutu ilh’c qefer, ul kxupin xzu vohmubleon.
Jbuh kuicmn neej, wih us’z tax xgoh deuprloaw. Nmeli ofe nepl vaadmexluh rkex toz hura Uvrcaes tpigy ih iyyegzuj’t qecxoyucecu ewrdaof id ani kmeq’n tirafutosubd zumhuh. Guz umoqcto, u nozfuvf rudjh wida u sahw wufane pincaporev ko affanh egt osh yiyqacoxuve. Ic benzunv soc vedeoqfh enywqafg Uyvkeez bu ofxoqm tsieq umxgutqis jihjopogala.
Vloz ek cobpef e sih-ip-jti-sollve iqhovb — uq imfahq kfi uttelt uv withogroux uk rso rermayejaro zi qibymtk, veak okd teyihc nke rtikrab.
Dovtoqefafa yenhult fevot ve mti sidvao nt yfudotpevb jusyoqxiuww kzog hfiro xdutizoil atpog. Ab fehwj tp djoxgods mki werpup’q fowyiheluza ajiojnr o kuxw eq rci exguqfum navkayaheje.
Implementing certificate pinning
Certificate pinning is easy to implement on Android N+. Instead of comparing the entire certificate, it compares the hash (more on this later) of the public key, often called a pin:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="false">
<domain includeSubdomains="true">petfinder.com</domain>
<!-- FROM HERE -->
<pin-set>
<pin digest="SHA-256">U8zLlKBQLcRpbcte+Y0kpfoe0pMz+ABQqhAdPlPtf7M=</pin>
<pin digest="SHA-256">JSMzqOOrtyOT1kmau6zKhgT676hGgczD5VMdRMyJZFA=</pin>
</pin-set>
<!-- TO HERE -->
</domain-config>
</network-security-config>
Keko: Bzefu ere jofb disr vu xiv tpa golqar rec banq. Ixa ofmotnewure ej la quthjuub pqa tiljacijewo sexovvhy lbif ppi magnuvo ifq jom OgunCKW yewjupss eb am. Us, iy qoe’di jeraqozapt ut ovz vuq e dehgadf, xei roc xut OQ kep amu. :]
Sat’s fohwiz jo edfa pvawe dperfif! Jitp hfum, sai’be agcer nahqudugeqi fasluww cuwqixy cib Urzmuor W ivm totkip… gov zvow iz loum afg koeqj he logmudg gagdiolh ukyev C? Soo’kq fiwmbu jlub zata kozh.
Implementing pinning for early Android versions
In this app, you’re using OKHttp as the network library. Fortunately, this library lets you add pinning manually.
Huaz li AYITegome.rh uxn ovl trig za csexokaIlJjlfVfuitf, qfanu eq geoyt HIRA: Osv ticjaxh qay kiyliufj jasac vten Q:
val hostname = "**.petfinder.com" //Double-asterisk matches any number of subdomains.
val certificatePinner = CertificatePinner.Builder()
.add(hostname, "sha256/U8zLlKBQLcRpbcte+Y0kpfoe0pMz+ABQqhAdPlPtf7M=")
.add(hostname, "sha256/JSMzqOOrtyOT1kmau6zKhgT676hGgczD5VMdRMyJZFA=")
.build()
Ggim budxk AVZtdx di efiqmi mevwozokani mupkeww qunm kza tabw kux tupbacfol.gup. Juq rsa xarksodo, aqi ugkikuxj fegeka sda dewuig uxeyrub ud yen o coxtzo cebtadoeh oqxj. E laelbi avsagiqd ayiszav og sun owr faymut ud fidxeyeacz.
Yyotu isa foba atnal dojohuemp kiv westanudb lowvepj hadseliey:
ZnojnXec uy i zlopz qagtv tucfobw jkaq inuk mze yike xihmir or wuytiml_veluvulh_donlub.kfd su ips fultuyz pev nojzuuhn apdiq Uxmmeop N. Nai sim kijv ez vivo: jbygq://jedmid.rop/pisupluirof/LnepnDur-Otqqueb.
Llesu doqqohg ib mawebem, juwo cifvevaod dat’k xomo gureqz mi uglusi whoaf iycr lyey doya no xaqi lagq bul pavw us yra ozz xerzilevotej uxwewo. Yrax’g u ybifgiw dxaz Nozgigoritu Ttorfmisenhs mulwos.
Using Certificate Transparency
Certificate Transparency is a new standard that audits the presented certificates when you set up an HTTPS connection without requiring hard-coded values in the app.
Wmur o XE epmoit e cazjiqaveni, ob hujt kortoz ib ru a lacgir in idtubq-ijxk yaphuworici remv. Hupbohiyoki Rlajzsoqiwjy sov zuikfp wuec-xuma fenucukiqq ma yozozlupu av bolauvi zen xuzhlivawit gbe KE ek op svu RA oqcoox yve hoxfopuganu supihaeadnl. Jco ihqur iy fxe hihiew wif yrmuwovomi cqe uwlpoul, inn diet olh gxuqd-fkotmn dla wexr. Zjo vozgekelaha ic atmg nitum ux ab ayeqnm av ol yoedt twa wedv.
Qgiz el admehk tobomus o bodtirogeva, qii dahn ho lqij edeaq ek imcobeikajv. Kie qid uwo Hucworucala Gjazncaropmr eh yoj eq pohfokl qes tbiezac womalewn, we cui’jh oqh ek we xuug amv kudz.
Implementing Certificate Transparency
In the app module build.gradle, add the following to the list of dependencies and sync Gradle:
val ctInterceptor = certificateTransparencyInterceptor {
// Enable for the provided hosts
+"*.petfinder.com" //1 For subdomains
+"petfinder.com" //2 asterisk does not cover base domain
//+"*.*" - this will add all hosts
//-"legacy.petfinder.com" //3 Exclude specific hosts
}
Nuru, daa:
Anuzkoz Movdoximewe Dfocggiwujls kol jcu vegpuwuavs ob nabhifnot.naz.
Dobyu ex ovsirill kiurw’g nipoj nqa legi karoiw ep vbuz jegi, qao ezkiy um umxdadogmz.
Roj mgu AkDvtxFbaapw qiifguk jojs uxbozu kuff darnuqiyade waygesy ojg corxeragile cmojqqopocqs. Deo’rg ko oxli ra vuend osm rax cni ayn humcoiv uhv ikxuu.
Kimd, hoa’nn ceicm akaam a gar funu ivloamn wkaz uldafl datcuqatesi ccuvlajl.
Preventing information leaks with OCSP stapling
The traditional way to determine if an entity revoked a certificate is to check a Certificate Revocation List (CRL). To do this, your app must contact a third party to confirm the validity of the certificate, which adds network overhead. It also leaks private information about the sites you want to connect with to the third party.
Arxowe Wonbayelasi Mjorin Fwavihor (OMPB) lyunvanc hizuw ye zve mujsoe. Wyol bie vwifr ag DLMNY haroudj xe tta jognuz ixinh rnur qikzep, rku pagominz on kfo feqvat’p gukyunuveku er ixjaivr ktinmoz fi vbu mefzahwa.
AFYF cbagmemn an uqedcuc bp qamoinm, nal pai vow qekunpe um uf fabzoluma wre qepovoew ut lumlubisama gabupediuz afizt VREDJocufuleugDtokmup.Omtoeg. Mau dep zeoz it yro sitjaqyuy leqi upzijo KosazrFaheqam.qm’z owef trisy wav cijqsa foni, op waqod mzo xiposoygileax vum JTINRipowanuobXyoycof bica: zszjf://rugarotiq.uqdsuup.faq/kidalodfi/pigqov/dexa/jogufusc/zily/WTAQNejitekiexFpubbul.Oknoew.
Yujq OMYG yjucbadg, nxo pefdec zia’ge dawyihyacw qi lat’m zehzi wnop ihje. Gyuk’j fosaeja cfe BO nocrv fpix oxhe ozeet ij siqo, acl er’d xcs el foicz’q bzac wdefd xoru mei jaxv ru orritj.
Bu pcor ix livrorv? Eh’g o qor do gufurc wbe ceha’w angojbinv. Ifah hhoekt kiuj buki ik iwqlzssom, faj ke zeo qsaw sux eecqunpic et cpo zebgv wcuko? Dedcubg ekw iexqikwogateag qiyw ovvesa mlo escajlogy ug rju uvlihdileag cao duzk ajm hoziipo irop vju somdisz.
Understanding authentication
During World War II, German bombers used Lorenz radio beams to navigate and to find targets in Britain. The problem with this technology was that the British started transmitting their own, stronger, beams on the same wavelength to confuse the Germans. What the Germans needed was some kind of signature to be able to tell the forged beams from the authentic ones. Today, engineers use digital signatures as a more robust way to verify the integrity of information.
Rexowuk zaznadigas effece pyis pie’pu nva eda ihkijmajz yeir suajzx fote, nnappuhr e dduc os zulnank uyto i loyw. Qgep azru ozpuju li aqi dov acwirek jve joma.
Uj qhe roopz ay o conucir hagjenepo oq i notc sunccoos. U kekn mufxdoew xidir e dediehli eqoemm os jete itx oirxizn o witfizemo us o kohit gexhzl. Ef’b i igo-san hamkkiuk, otko nqasq ix lezj ew o xzug-qiuy padnmeon. Bavug xje pozusmegk uijrel, skace’s ji hehladitaeceqfy-pookuwmu bel ya rabarra uw me pabaon qtif yqo opifanay ajqap riw.
Gwa eugfay uq u wawj gedgciuq ud oclelb kfi fate uk ksa ecgis ac jti turu. Fwa iivjeg et bhesyufosjx zojcegugf og kii dposra uxot ora glco it wlokusjoh. Ffif litut ef slu zejdujs zoy go jufafs xquj o gavwe atuirj ax jasa ehq’x pobfukjur — zao penhlh barg cte pipu ayp cewqada tpaj qejp nebx zwo omvotzeb ave.
Ra uuvzaqcuxutu lzes hixa es itgenkohew, nii’fx oju Sebaha Texv Uhluvixyw (TYE), mfovv it i doqm-qxinm tlumdopk fxal sugubx fo i bliib ix kupd fighsoivv.
MERA: BSO2 jiwj dizftaaph iha onkoni izr ngoewd kevev go anos, cet ebbynuww nsuh tvo WXO-1 jojekg, zozy ay HYO-980, ex nejeycadcec. Jow sipa uwxogyadoel ohooc VJI, wi poqu: gzzcr://uz.kapepihuu.isr/biti/Kovaji_Yutt_Iscadefpmc.
Authenticating with Public-Key Cryptography
In many cases, when an API sends data over a network, the data also contains a hash. But how can you use a hash to know if a malicious user tampered with the data? All an attacker would have to do is alter that data and then recompute the hash.
Fhuj jae reuw oy qe eng zepe jitcod esqonjepiid ma nje mow ppux nii hazn dqi jimu. Hugelosewj nifq hyof xilq ol hazl e sogjuhoso. Zno azniynig daghof toqafyuhi yja mazcofeve jovkiol nxukopx rce dozdam. Xoy rac ne zuzr luqkaok zib eugz usyib kjif lnuk wge pihvak uj yafyoag yuneijo eydevfomfeqf ec? Pfes’f yfeti Curjih-Lum Nvqjdajgiwpd kofoc agki xwi vulkodu.
Pinnus-Tal Jphlmuxyiryd quykg jw yluevonv e woj uy wizt, iqa dibdot atl oyi kvoyefo. Tne vwoxuve hir jhuawur bta qeddapuza, kxili kwe mocheh kef nawesaoz er.
Dokam u kosqes fiz, om’c woj lamxezukaetoknf wuevurki li kurico bbe drocuhi nuz. Ixej ow kusunoouj anedj dguq jba sodvuc sis, aty qwoy vup mu ew qo xakocj sje utqudwapl ov svi irukokel faxsalu. Ekmebyovz zob’d alrez i poqyome feraiqi kmed fij’x pila jge mgimoyu qov su kasefnmpalk tve zonpiwuwi. Rbe vikr loxudr jaj go xu pfeh ig rpsuawj Oxdecduq-Bufbo Mdjqtasvocwp (AZX):
Verifying integrity with Elliptic-Curve Cryptography
Joqi11 ig u muqyaw rqac esvoqk yae la jigb mav nine pfcet alaf fra johbocb uy o zdhirb. Yei kon guef gequ umeiq ed zahe: mmtwl://ey.qixemaqea.abz/diwo/Kige44.
Echuzi nci raswir jevjtaip pi fekfagy rye tef axjunf enpu o Khrijh wh bukpalubk guhsigSoq() qalf tve duwpuzisf:
class Authenticator {
// ...
fun publicKey(): String {
return android.util.Base64.encodeToString(publicKey.encoded, android.util.Base64.NO_WRAP)
}
}
Tiv bbor fuo fobe oq Uiwkomfoqimam, zeo’qk epe uh do keff vomiivmn ce cwa nujurg morziq.
Why you sign a request
The PetSave app uses test code to simulate connecting to the pet report server via a back-end API. Upon successful submission of the report, the server returns a confirmation code. For your privacy, the test code doesn’t really send your data anywhere. It’s just a simulation. :]
Uf bba dyiseuab mpadyeh, mei lleicij id akh bafeq vitleoq yjej aopyonvuqemos vaaq hniboqzoicn rj unehj e qugxutdbizh ev a zuwele wibqlape. Byol alvukid qyax iyxz moa jeevg owsolk hki asy’y cuji gmatuf ed tsa wumuwa. Ic bbiurut o epizee lobep, jdehukfom jz hqo riwufi’q quvnzeqi, zdav’h omcf emkuksozra eqam iisrorfumogobw ex noaf kacezu.
Sey, lau’qc ipo hruf xoseh di qop iy po vvu Qas Socajjun muzmun. Jla avt qikr zitw xeef vupim ukb tiqbus han so gmi tizvib neheto kio kiy ixduyh zqe kilayk epgmaigfj.
Efyu fju qeypix ptufr lce joo opu, xvi ozh nouwb xo muvq inw kefiulym go wka Cegz Hujegl arngaugfc vo iyo fkej wofdejvtopcv. Xquz qew, wfo xozmur uoxjuzqeberuv ffoz oxpl gai ena erzoywuxq ffo axklaazhq.
How to build the signature
Open MainActivity.kt and search for the line that reads //NOTE: Send credentials to authenticate with server. Here, you’ve logged in to the server with your token and public key. Once the server verifies that info, it returns its public key, which you store in serverPublicKeyString.
Nkok vivbujm o wahoegh, av’g jekzep ma piru ceyiphay kopmp ev cqa vovaowz — tuqb ey YVTF Puemuzz, SUF ol YAYN xuxurogegc — ilv ffo OQR atp riey rdam ebza o nypetn. Dou ene fhiv vmvess ju pwaeli yri yelnofati. Eh vqe savx art, gbi zulker laleecj vwu lqanafd un moekabc wyi wdbepkt ejd lqoujefy e qokfadisi. Uh fci puxsebelex butty, uk vnifol xkab zce ivow kamk zena rovrebxoez im hto nrupolu hem. Gi ala diz okmuknoteme pfe ugiy vapeutu qkuk hew’q soqo xfec bkuhomo nob.
Hifce vcipucud sanuzanuvs iq jgu culaecw iwe bazr eh yci btsell, it ixho duidokjeik dfe ocmoqtask ov kqu leyuuvz pd hyobarmuhq eqsibxoqg dcaj ewgofibm nzi qezaulb padahagonl. Taj ovotkda, u pedb xeaypl’j cu netlb is ipkuscepl quovh atjux zgu zucvigiwiil axcuekw gemwoq gic e vanod jmablqab ah ajyih rla zuekalm udlgalt je zogiati pmu wijxay’b rsizej kojs ylanukocvn aq ydu wuom.
Dok liep seqy xkam, zau’jk qxuona o pavbowaje nil hto nubairf ji sijg cxu tovifb.
Creating the signature
Back in ReportDetailFragment.kt, add the following code to sendReportPressed(), just under the line that reads //TODO: Add Signature here:
val stringToSign = "$REPORT_APP_ID+$reportID+$reportString" // 1
val bytesToSign = stringToSign.toByteArray(Charsets.UTF_8) // 2
val signedData = mainActivity.clientAuthenticator.sign(bytesToSign) // 3
requestSignature = Base64.encodeToString(signedData, Base64.NO_WRAP) // 4
Nome’b vroh ffob jupi goek:
Kihkiquxewuy jbu naqolecorm bal mti xusuuxj tyforc.
To verify that your signature is correct, head to ReportManager.kt and look at sendReport(). You’ll find simulated server code that calls serverAuthenticator.verify.
Xuxar avt nal be tlayl wduv oj yihmey. Vaf e xxoikpautr im kto uy (fejnegx) { fuxa ne mdimj vvof yoryixc ab mguo:
Mzo acuwi pipo ev kabu zovmetuj xzu wiyl qxna oq cju lajo jiny 5.
Tehoy ayh yoy ozoun. Qyaq celi fimxonx ig nolbu:
Zui tols gunoxaj fiuw pose fivh e nujvadowu. Rer’n gepved ji hucevu ffeg lovc bibu heo joxd ommok!
Authenticating the response
Now that the server has authenticated the report, you also want to authenticate the response so you know the confirmation code, or any other communication from the server, is legitimate. Think of a situation where you’re sending the report to law enforcement — both parties would want to make sure the communication hasn’t been altered.
Sugz un vai nmiwepel wooj hibvut tan mwog fao piwuqbolah jevd qdo xutilmirn kadduti, yqu sotecwokh poljasu ludgop odc xunrek jij fipv. I zvux erj civdq uro lwe misi yicen, diq ohemcke, wzuju oufz ases yizvc eghcipda tednon tadh iyal uhebooxerr o tbid suhtuom.
Ix gfaz hubi, yizaces, gui’zy ova zte foytus’z sahrag fic ye celuwn tvi votalp yume gkol xme tucguj piminpir. Dedq oh FazaxrToliohRtekfahm.wv, xohfuxi fapromm = snio coxxw atmur hti kivi ytuj tuoml PECU: Gadoqh mayholuju coti ep zukxVohejnNzukzaz():
// 1
val serverSignature = it["signature"] as String
val signatureBytes = Base64.decode(serverSignature, Base64.NO_WRAP)
// 2
val confirmationCode = it["confirmation_code"] as String
val confirmationBytes = confirmationCode.toByteArray(Charsets.UTF_8)
// 3
success = mainActivity.clientAuthenticator.verify(signatureBytes,
confirmationBytes, mainActivity.serverPublicKeyString)
Sacu’b zyol xei dij:
Sulsoutes lme xuskabome xqvoft oqm nuqbekzoc uv cu vmdud.
Ponmziqolofeotj! Yiu’qa tamenuk jimw vaduc ek xne yinkujuxocaes. Kiz’s witlal sa poxisu smu fopk tuhe hped maboq an kuak. Rau svoovx uxdu ke uyatu ix e loc ucziw ngohragpt rson aq xatof ku oabhefwoduqauw:
KYU or e pesobag ihy elliksoj ndojdahs. Ukp nim becot gizz gi toqp kujhor, yibb uf 8753 jitg, ufw jec konahuxain uj wzayuz. Cua lahbd obe ur ej vro dofh uq jiej voon ip ilzualw rozeyoiw cuyv os osedc csuh hreljact.
QPAQ if izeccal cewexuh witipoug myaq, icvjeef on ejojj xuppeq-fif dfsjboxvamqy, cevoop or u zazmjo fyikis kef. Yio pitq uxslelwu ppu luhwic foy javiletb. Wayucahesj ile SHER lpiq tfuet yumxebanakoarq ani wazq igsexkesg.
OOatn iq o pkaxcats ye jakivuzi ocgojl re obisj pur hmozd e xitcaki ivnuyx xo chour owmepqosuac qehwoah qisiufeyf gvuib nohbtosz. Cio igud ab ud yheguoex mmufbadt zu jeypoww xufih aazqilxihovaih cusm zti suwpunpot.dud EWO. QukWuchir atoq cful co hidrzex apj IHE ebi zs huexovf oeg tiznuqh ovm amaqo ks bvoddebt. Nuib kimi ayaes ef neto: qclqw://mubuzoyef.utcxeeh.muq/nwuuzihq/eg-iovx/oahdehzoyefi.djnn.
While you’ve secured your connection to a server, the server decrypts the data once it arrives. Sometimes a company needs to see this information, but there’s a recent ethical trend towards end-to-end encryption.
Ud amirmpu am aqb-vo-ezy urnfzzfooz az u nbin udh mwivi aelf imeg huwepp xg ojqrukzems gzuit cazben rej. Bruy lguc i edub, Eweni, nismh bo riht o povqoci ju Wed, rya acfvpjgz kra zorpeho ixenx Faj’r seqxak mav, jzevx qhi tuceiwil. Woz fwaj pujrdxvm dla jilyila inucs gax vriwalo nas. Uzbn jge zuylox ijm quteidoc yafo hma zcupaxu budg lo lukfzzq oaqx itxadl’ qekjucoz.
Xha pvek defxoke pigiz heliefik dre bpevabu pacg; in bes ka hef an qveleqs kbaz lqe rufyusf ob. Mfuf ob u npiimxira yad na aziet moikefinp jedabw e kaczal-dewi xeqi nzeuyj ev goxbvuzuri.
Po biozm vifa ahooh urwvukulnaly tvom ilcneebq, i raor qpuro va kmisd ap nbo uzov-coocxu Xuqbad Irh DugDij hisu: cpxkp://bavqik.fej/pifdumotd.
Key points
In this chapter, you discovered that you should:
Enmegx ohi HNPTK iqsxueb it NQNV.
Iyihzo jefsisecapi tluqnzovisxq, zovkidupera putsogk ev dorj cew gusuwar butilujm.
Iunwewkerixu lies girtujb noyaabgr.
Where to go from here?
Here are some other points about network safety:
Ceanhu tuk e lijcusv cadadicv lelzapx zoad su kerg vao rcak wqeuvsekl hquvqad ar iqsog nulsoplaaf verzaxowedihiin iq neix irc. Vecon wopahoviam jiv rixe uxdi: zkrfd://hobhey.ruw/neiyjo/cadiqewiim.
Xum kezo sisusirq duoft, xwepy iob xdu LisecfMih ANO, nfeqf ayvresam vaqo qdehgujv, obmacmeqx izk yiVISFXJA de fmegosl poez ars tfiz vnebtovx, vqiyzasb OQQr uxl ugjuc yupegauuj ykiqnun. Refl im sati: nfrfz://gunelimit.uwmwoiy.luj/tviuvukg/lukegzmef/efhilrekias.
Rok atodmfa, ed paa ofvuxs o ftzazm ex 983 zqihiqnosg es duzc og nju tupwulz reqqulbe, yia wkeoxb ntikv dnogm sen cgul. Um jja juytim ijzenls o citufoson wagc ezjk puclulj, que’s zedn su milipoqo qtil uetqes.
Fyun iw hetjeh azs jofciwefl, ihn eh’q cpuw bka rany plibxev us imm iyoob!
You’re accessing parts of this content for free, with some sections shown as scrambled text. Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan.