Enc: en krypterad meddelandetjänst baserat på engångslänkar

Permalänk
Medlem
Skrivet av BrutalSwede:

Att man inte ska ändra en användarens lösenord genom att ta bort mellanslag... Har en användare matat in ett värde så accepterar man antingen värdet, eller skickar ett valideringsfel som säger att lösenordet måste uppfylla kriterie X/Y/Z.

Först togs alla mellanslag från ett lösenord bort, vilket jag erkänner var fel tillvägagångssätt. Nu raderas endast mellanrum som är före och efter lösenordet. Men jag ska självklart skriva in hur allt fungerar och vad som kommer att hända

Visa signatur

Citera mig om du vill att jag ska hitta till ditt svar.
airikr.me. Andra projekt: Keizai, Koroth, Serenum & Enc.

Permalänk
Medlem
Skrivet av Airikr:

Först togs alla mellanslag från ett lösenord bort, vilket jag erkänner var fel tillvägagångssätt. Nu raderas endast mellanrum som är före och efter lösenordet. Men jag ska självklart skriva in hur allt fungerar och vad som kommer att hända

Bättre att bara ge användaren ett felmeddelande isf och be dem skriva ett nytt lösenord utan mellanslag.

Som alla redan sagt, godtar man ett lösenord från användaren så ska man inte göra några ändringar alls i det. Sen att begränsa vilka tecken man får använda gör bara lösenorden mindre säkra.

Visa signatur

| MSI B650 Tomahawk | Ryzen 7 9800X3D | ASUS RTX 3070 | 64GB DDR5 6000MHz | MSI MPG A1000G | Samsung 970 Evo M.2 1TB + 2x WD Black SN850X 2TB|

Permalänk
Medlem

Vill bara säga detta lite snabbt. Jag kan ses som ignorant/obrydd gällande era svar, men det är oftast för att jag inte kan tänka klart och inte heller riktigt kan förstå vad ni menar. Som ett exempel var min hjärna typ avstängd i går, från kanske sena förmiddagen tills jag gick och la mig för natten. Jag tar in allt ni skriver så gott jag bara kan, och tar emot alla tips jag kan få. Men ibland kan jag verka ignorant/obrydd. Det är inte meningen.

Plus, mycket i det här projektet är helt nytt för mig. Jag måste tänka säkerhetsmässigt och sätta mig in i saker som jag aldrig har fifflat med förr.

Skrivet av BrutalSwede:

Bättre att bara ge användaren ett felmeddelande isf och be dem skriva ett nytt lösenord utan mellanslag.

Som alla redan sagt, godtar man ett lösenord från användaren så ska man inte göra några ändringar alls i det. Sen att begränsa vilka tecken man får använda gör bara lösenorden mindre säkra.

Så sant som du säger. Kommer lägga in en validering för lösenordet som säger "ajabaja" om besökaren lägger till mellanslag före och/eller efter lösenordet, och om det är mindre än säg 8 tecken. Ett lösenord ska få vara oändligt långt om man så själv vill, och jag kommer inte begränsa några andra tecken än just mellanslagen före och efter lösenordet. Jag typ hatar tjänster som hävdar att man använder ett osäkert lösenord bara för att man har med specialtecken. Fattar inte..!

Visa signatur

Citera mig om du vill att jag ska hitta till ditt svar.
airikr.me. Andra projekt: Keizai, Koroth, Serenum & Enc.

Permalänk
Skrivet av Airikr:

Först togs alla mellanslag från ett lösenord bort, vilket jag erkänner var fel tillvägagångssätt. Nu raderas endast mellanrum som är före och efter lösenordet. Men jag ska självklart skriva in hur allt fungerar och vad som kommer att hända

Tjo igen! Som andra redan starkt rekommenderat så kan du betrakta lösenord som något som alltid bearbetas innan det egentligen skulle kunna göra någon skada, t.ex., innehålla skadlig körbar kod. Du förvandlar ju lösenordet direkt efter inmatning så saneringsfunktionen av att ta bort mellanslag före och efter det tappar sitt syfte jämfört med inmatningsfält där något kommer att lagras precis som det matats in (t.ex. e-postadress, för- & efternamn., med mera).

Jag skulle också starkt rekommendera att inmatningsfält för lösenord som bör förvandlas omedelbart (hashas eller krypteras på annat vis) behöver ingen inmatningssanering i form av radera mellanslag före och efter så tillvida inte du redan har bestämt dig för vilka slags tecken som får matas, dvs., datavalidering. Detta bör ju dock synas med någon liten paragraf under inmatningsfältet, t.ex. "Endast följande tecken får användas för lösenordet: a-öA-Ö0-9!"#¤%&/()".

Exempel på där du kanske vill "standardisera" hur något ska se ut efter inmatning är exempelvis telefonnummer. Jag gjorde i ett projekt så att telefonnummer kan matas in via +46-076 123456 men sedan lagras det alltid med enbart siffrorna (46076123456) så att telefonnumren ser identiska ut. Huruvida detta bör ske redan under inmatningen, dvs., att du inte kan ange +, mellanslag och/eller - är en annan oändlig hårklyveridiskussion, imho.

För lösenord rekommenderar jag starkt: antingen meddela redan i klienten vilka tecken som tillåts och validera efter inmatning (anta någon fular sig och skickar POST via Thunderclient) eller så tillåter du alla tecken.

Mvh,
WKF.

Visa signatur

(V)ulnerabilities
(I)n
(B)asically
(E)verything
Programming

Permalänk
Medlem
Skrivet av WebbkodsFrilansaren:

Tjo igen! Som andra redan starkt rekommenderat så kan du betrakta lösenord som något som alltid bearbetas innan det egentligen skulle kunna göra någon skada, t.ex., innehålla skadlig körbar kod. Du förvandlar ju lösenordet direkt efter inmatning så saneringsfunktionen av att ta bort mellanslag före och efter det tappar sitt syfte jämfört med inmatningsfält där något kommer att lagras precis som det matats in (t.ex. e-postadress, för- & efternamn., med mera).

Jag skulle också starkt rekommendera att inmatningsfält för lösenord som bör förvandlas omedelbart (hashas eller krypteras på annat vis) behöver ingen inmatningssanering i form av radera mellanslag före och efter så tillvida inte du redan har bestämt dig för vilka slags tecken som får matas, dvs., datavalidering. Detta bör ju dock synas med någon liten paragraf under inmatningsfältet, t.ex. "Endast följande tecken får användas för lösenordet: a-öA-Ö0-9!"#¤%&/()".

Exempel på där du kanske vill "standardisera" hur något ska se ut efter inmatning är exempelvis telefonnummer. Jag gjorde i ett projekt så att telefonnummer kan matas in via +46-076 123456 men sedan lagras det alltid med enbart siffrorna (46076123456) så att telefonnumren ser identiska ut. Huruvida detta bör ske redan under inmatningen, dvs., att du inte kan ange +, mellanslag och/eller - är en annan oändlig hårklyveridiskussion, imho.

För lösenord rekommenderar jag starkt: antingen meddela redan i klienten vilka tecken som tillåts och validera efter inmatning (anta någon fular sig och skickar POST via Thunderclient) eller så tillåter du alla tecken.

Mvh,
WKF.

Tjo! Ja, där skrev du något, att lösenordet måste "strippas" (kommer inte på rätt ord för det) från all skadlig kod, så som injektioner av JavaScript-kod. Detta gäller även meddelandefältet. Tack Ska lägga in denna säkerhetsåtgärd innan nästa uppdatering läggs upp. Fick kritik om placeringen av loggan i går, så har gjort om lite

Som jag skrev i mitt förra inlägg, så kommer jag inte att validera lösenordet mer än att räkna antalet tecken så att ett lösenord inte bara är ett enda tecken långt. Har även lagt in en text under lösenordsfältet som berättar vad som kommer att hända när man trycker på dela-knappen, och att det måste vara minst 5 tecken långt. Att begränsa till endast godkända tecken kommer att läggas in om det visar sig att man på något sätt kan missanvända lösenordsfältet, trots sanering (rätt ord?).

Ditt telefonnummersexempel förstod jag inte riktigt Vad skulle jag kunna standardisera på Enc? Att man inte ska få ange +, - och/eller mellanslag i lösenordet? Eller... va?

En till sak: Thunderclient? Menar du Thunder Client-tillägget för VS Code och VSCodium? Jag använder endast VSCodium för och kunna komma åt servern och på så sätt kunna ändra i filer. Använder annars Lite XL då jag föredrar en mjukvara som inte använder sig av Electron och som är typ som EditPlus, min favoritmjukvara från tiden då jag använde Windows som mitt standardsystem (7+ år sen).

Ändrade "bara ett ett enda" till "bara är ett enda"
Visa signatur

Citera mig om du vill att jag ska hitta till ditt svar.
airikr.me. Andra projekt: Keizai, Koroth, Serenum & Enc.

Permalänk
Medlem
Skrivet av Airikr:

Tjo! Ja, där skrev du något, att lösenordet måste "strippas" (kommer inte på rätt ord för det) från all skadlig kod, så som injektioner av JavaScript-kod. Detta gäller även meddelandefältet. Tack Ska lägga in denna säkerhetsåtgärd innan nästa uppdatering läggs upp. Fick kritik om placeringen av loggan i går, så har gjort om lite

Som jag skrev i mitt förra inlägg, så kommer jag inte att validera lösenordet mer än att räkna antalet tecken så att ett lösenord inte bara ett ett enda tecken långt. Har även lagt in en text under lösenordsfältet som berättar vad som kommer att hända när man trycker på dela-knappen, och att det måste vara minst 5 tecken långt. Att begränsa till endast godkända tecken kommer att läggas in om det visar sig att man på något sätt kan missanvända lösenordsfältet, trots sanering (rätt ord?).

Varför det fetstilta? Det blir krypterat, det finns alltså ingen risk att något ö.h.t. injiceras för att skada andra.
Väljer du att dela JS-kod så får du väl dela JS-kod? Se till att bara skriva ut det som text dock (t.ex. jQuery .text()), och inte som att lägga ut det rakt upp och ner (för då blir det antagligen HTML, om HTML är i meddelandet).

Lösenordet är dessutom något som endast används i klienten, har svårt att se hur du skulle kunna få in någon sårbarhet genom XSS eller liknande där.

Allt du gör för att förändra lösenordet kan potentiellt försvaga det. Tänk på vad det är för tjänst du utvecklar.. du vill kunna dela innehåll (meddelandet) på ett säkert sätt. Inte att du ska skapa ett konto där lösenordet kommer användas flera gånger.
Nu handlar det om engångslösenord. Får mottagaren fel lösenord (kan inte avkryptera meddelandet) så får de väl dela om det och se till så det blir rätt från första början

Visa signatur

NZXT H510 Flow MSI B450 Tomahawk MAX
AMD Ryzen 5800X3D RX 7900XTX Kingston Fury 64GB
LG C2 42" 4K@120Hz AOC Q27G2U 1440P@144Hz

Permalänk
Medlem
Skrivet av Pamudas:

Varför det fetstilta? Det blir krypterat, det finns alltså ingen risk att något ö.h.t. injiceras för att skada andra.
Väljer du att dela JS-kod så får du väl dela JS-kod? Se till att bara skriva ut det som text dock (t.ex. jQuery .text()), och inte som att lägga ut det rakt upp och ner (för då blir det antagligen HTML, om HTML är i meddelandet).

Lösenordet är dessutom något som endast används i klienten, har svårt att se hur du skulle kunna få in någon sårbarhet genom XSS eller liknande där.

Allt du gör för att förändra lösenordet kan potentiellt försvaga det. Tänk på vad det är för tjänst du utvecklar.. du vill kunna dela innehåll (meddelandet) på ett säkert sätt. Inte att du ska skapa ett konto där lösenordet kommer användas flera gånger.
Nu handlar det om engångslösenord. Får mottagaren fel lösenord (kan inte avkryptera meddelandet) så får de väl dela om det och se till så det blir rätt från första början

Lösenordet förstår jag, det förblir ju hashat även om man har angett rätt lösenord. Men när det kommer till meddelandet, så tror jag inte att någon vill att den JavaScript-kod sändaren har skickat ska köras så fort man har låst upp meddelandet Då vill man ju läsa koden. Så det kommer jag att fixa till (om det ens sker nu utan att göra något, men det borde det göra).

Ett lösenord försvagas inte om man endast tar bort mellanslag före och efter lösenordet Det är dessutom inte rekommenderat att ha ett eller flera mellanslag före och/eller efter ett lösenord.

Det ska vara så enkelt och följsamt som det bara kan bli, att använda Enc Det ska vara såpass enkelt, att till och med en oteknisk person ska kunna använda tjänsten. Då ska man inte hålla på och skriva om meddelanden för att lösenordet innehåller mellanslag före och efter lösenordet Man ska även tänka på att alldeles för många personer är lata, ibland sjukt lata. Klicka/tryck, klistra in, läs. Inget krångel.

Visa signatur

Citera mig om du vill att jag ska hitta till ditt svar.
airikr.me. Andra projekt: Keizai, Koroth, Serenum & Enc.

Permalänk
Medlem
Skrivet av Airikr:

Ett lösenord försvagas inte om man endast tar bort mellanslag före och efter lösenordet Det är dessutom inte rekommenderat att ha ett eller flera mellanslag före och/eller efter ett lösenord.

Förklara gärna detta? Självklart blir lösenordet svagare om du minskar antalet tecken? Och varför skulle det nu inte vara rekommenderat?
https://security.stackexchange.com/questions/32691/why-not-al...
https://www.infosecmatter.com/spaces-in-passwords-good-or-a-b...
https://stackoverflow.com/questions/632167/should-users-be-al...
https://pages.nist.gov/800-63-4/sp800-63b/passwords/#complexi...
osv..

Skrivet av Airikr:

Lösenordet förstår jag, det förblir ju hashat även om man har angett rätt lösenord. Men när det kommer till meddelandet, så tror jag inte att någon vill att den JavaScript-kod sändaren har skickat ska köras så fort man har låst upp meddelandet Då vill man ju läsa koden. Så det kommer jag att fixa till (om det ens sker nu utan att göra något, men det borde det göra).

Det är möjligt att sanitera meddelandet innan du skrivet ut det som text. Alltså att omvandla <, >, o.s.v. till html-entiteter - du ser ingen skillnad på skärmen, men i bakgrunden tolkas det som text istället för ett DOM-element.

function escapeHtml(text) { return text.replace(/&/g, "&amp;") .replace(/</g, "&lt;") .replace(/>/g, "&gt;") .replace(/"/g, "&quot;") .replace(/'/g, "'"); }

Visa signatur

NZXT H510 Flow MSI B450 Tomahawk MAX
AMD Ryzen 5800X3D RX 7900XTX Kingston Fury 64GB
LG C2 42" 4K@120Hz AOC Q27G2U 1440P@144Hz

Permalänk
Medlem

Citat från https://security.stackexchange.com/questions/32691/why-not-al... (första länken i ditt inlägg): "Leading and trailing spaces could be trouble for people who are loose with copy and paste."

Man måste komma ihåg att folk är lata.

Lösenord får innehålla mellanrum i Enc, men inte före och efter lösenordet. Den tredje länken i ditt inlägg, har en kommentar som jag håller helt och hållet med om. Sagda kommentar tog jag även en skärmdump på och inkluderade i ett av mina tidiga inlägg här: #20667451. Citerar den: "When typing their password for logging in, someone might copy and paste it, which adds an extra whitespace here or there. If you don't trim this in your login processing code, they won't be able to login even though to them the password is exactly the same."

Jag försöker inte blockera några tecken (förutom det som redan är sagt), och jag försöker inte heller göra något lösenord svagare genom att endast tillåta max antalet tecken. Från och med nästa uppdatering av Enc, kommer man vara tvingad till att ange minst 5 tecken i ens lösenord. Jag skrev om det i följande inlägg: #20669205. Och för att förklara varför: ett säkert lösenord ska egentligen inte innehåller färre tecken 14 (källa).

Så varför har jag valt minst 5 tecken? Jo, för att det finns inte många personer som klarar av/orkar att sätta ett lösenord manuellt på 14 tecken eller mer. Då kan man såklart använda sig av lösenordsgeneratorn som jag har på Enc, men många vill helst bara skriva in något de lätt kan komma ihåg eller nått annat jox. Helst ett som mottagaren redan kan, vilket skedde i går.

Jag träffade min bror i går och visade upp Enc för han och en till. Brorsan dök rakt in på att skriva in ett eget lösenord, utan att använda lösenordsgeneratorn, och hans lösenord var långt ifrån 14 tecken långt, men längre än 5 tecken.

Jag har tidigare skrivit i denna tråd, om att mellanrummen i ett lösenord trimmades bort som en nödåtgärd just där och då. Det blev "snabbt" åtgärdat, så från och med då började jag att trimma bort mellanrum före och efter ett lösenord.

Skrivet av Pamudas:

Det är möjligt att sanitera meddelandet innan du skrivet ut det som text. Alltså att omvandla <, >, o.s.v. till html-entiteter - du ser ingen skillnad på skärmen, men i bakgrunden tolkas det som text istället för ett DOM-element.

function escapeHtml(text) { return text.replace(/&/g, "&amp;") .replace(/</g, "&lt;") .replace(/>/g, "&gt;") .replace(/"/g, "&quot;") .replace(/'/g, "'"); }

Tack

Visa signatur

Citera mig om du vill att jag ska hitta till ditt svar.
airikr.me. Andra projekt: Keizai, Koroth, Serenum & Enc.

Permalänk

@Airikr Om det är på PHP-backend krypterad text först dekrypteras och sedan skickas tillbaka till frontend så går det att använda htmlspecialchars() vilket är den inbyggda PHP-funktionen för att omvandla vissa webbtecken att tolkas som ren text istället för körbar webbkod.

Den där funktionen rekommenderas starkt för utskrift av all användarerhållen data från exempelvis formulär, lagrat i databaser, med mera. Det är den som gör att jag kan skriva <script>alert(document.cookie);</script> här utan att hela omgivningen får se alla mina Sweclockers-kakor!

Mvh,
WKF.

Visa signatur

(V)ulnerabilities
(I)n
(B)asically
(E)verything
Programming

Permalänk
Medlem
Skrivet av WebbkodsFrilansaren:

@Airikr Om det är på PHP-backend krypterad text först dekrypteras och sedan skickas tillbaka till frontend så går det att använda htmlspecialchars() vilket är den inbyggda PHP-funktionen för att omvandla vissa webbtecken att tolkas som ren text istället för körbar webbkod.

Den där funktionen rekommenderas starkt för utskrift av all användarerhållen data från exempelvis formulär, lagrat i databaser, med mera. Det är den som gör att jag kan skriva <script>alert(document.cookie);</script> här utan att hela omgivningen får se alla mina Sweclockers-kakor!

Mvh,
WKF.

Nä, allt krypteras och avkrypteras med hjälp av JavaScript Så jag får leta efter en sådan funktion för JavaScript.

Hehe, jodå. Jag använder htmlspecialchars() till min safetags-funktion för många av mina projekt

Visa signatur

Citera mig om du vill att jag ska hitta till ditt svar.
airikr.me. Andra projekt: Keizai, Koroth, Serenum & Enc.

Permalänk
Medlem

Nu ligger den nya uppdateringen uppe på enc.airikr.me. Om ni har besökt sidan tidigare och allt ser konstigt ut eller saker inte fungerar som de ska, rensa cacheminnet i webbläsaren och ladda om sidan.

Ändringslogg: https://codeberg.org/airikr/enc/commit/a5c883840afa5613e6ed46...

Visa signatur

Citera mig om du vill att jag ska hitta till ditt svar.
airikr.me. Andra projekt: Keizai, Koroth, Serenum & Enc.

Permalänk
Medlem
Skrivet av Airikr:

Citat från https://security.stackexchange.com/questions/32691/why-not-al... (första länken i ditt inlägg): "Leading and trailing spaces could be trouble for people who are loose with copy and paste."

Man måste komma ihåg att folk är lata.

Du verkar välja det svar som passar din uppfattning bäst, samtidigt som du bortser från information som antyder något annat.
I det högst rankade svaret på sidan som du länkar till, ovanför det du länkar till, står

Citat:

I can't explain it as anything beyond legacy madness, or lazily copying username restrictions to password restrictions without forethought.

Any block of data, printable or otherwise, should be acceptable if you're hashing your passwords. The only restrictions should be a minimum complexity and a "sanity" maximum length so somebody doesn't soak up 1MB of bandwidth (and the corresponding CPU time to hash the input because you use a slow algorithm, right?) every time they login.

Skrivet av Airikr:

Jag har tidigare skrivit i denna tråd, om att mellanrummen i ett lösenord trimmades bort som en nödåtgärd just där och då. Det blev "snabbt" åtgärdat, så från och med då började jag att trimma bort mellanrum före och efter ett lösenord.

Tack

OM du absolut inte vill tillåta omgivande mellanslag i ett lösenord så bör du VALIDERA det istället för att TRIMMA det. Med andra ord, om

password.trim() != password

så kan du visa ett valideringsfelmeddelande som uttrycker att det inte är tillåtet.

Det känns som att du tänker att validering och sanitering är samma sak, men det är väldigt stor skillnad.

TL;DR: Som andra redan påvisat, ändra inte en användares lösenord. Blockera istället värden som inte är tillåtna.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Du verkar välja det svar som passar din uppfattning bäst, samtidigt som du bortser från information som antyder något annat.
I det högst rankade svaret på sidan som du länkar till, ovanför det du länkar till, står
OM du absolut inte vill tillåta omgivande mellanslag i ett lösenord så bör du VALIDERA det istället för att TRIMMA det. Med andra ord, om

password.trim() != password

så kan du visa ett valideringsfelmeddelande som uttrycker att det inte är tillåtet.

Det känns som att du tänker att validering och sanitering är samma sak, men det är väldigt stor skillnad.

TL;DR: Som andra redan påvisat, ändra inte en användares lösenord. Blockera istället värden som inte är tillåtna.

Jag får ursäkta mig. Ändringslogg: https://codeberg.org/airikr/enc/commit/e2fc9633bc67902c9c7a35...

Visa signatur

Citera mig om du vill att jag ska hitta till ditt svar.
airikr.me. Andra projekt: Keizai, Koroth, Serenum & Enc.

Permalänk
Medlem

Förutom minst en bugg ("Message not found" även om man inte har hunnit läsa meddelandet), anser ni att Enc är säker nog för fullskalig produktion?

Med "fullskalig produktion" menar jag om Enc är tillräckligt säker för att användas för till exempel företag och myndigheter. Att lösenordet kan skippas i adressen och bäddas in i krypteringssträngen tillsammans med det krypterade meddelandet, har jag noll aning om hur jag ska lösa. Hur ska webbsidan kunna avkryptera lösenordet när lösenordet krävs för att avkryptera allt?

Det är bara en undran jag har efter alla misstag och annat från min sida i den här tråden Kommer högst troligt inte ta bort "Enc is under development. Errors may occur." förrän kända buggar är åtgärdade.

Visa signatur

Citera mig om du vill att jag ska hitta till ditt svar.
airikr.me. Andra projekt: Keizai, Koroth, Serenum & Enc.

Permalänk
Medlem
Skrivet av Airikr:

Att lösenordet kan skippas i adressen och bäddas in i krypteringssträngen tillsammans med det krypterade meddelandet, har jag noll aning om hur jag ska lösa. Hur ska webbsidan kunna avkryptera lösenordet när lösenordet krävs för att avkryptera allt.

Ett exempel;

Lösenord: "123"
Meddelande: "hej 123"

Kryptera meddelandet med lösenordet, det ger dig; "abcxyz"
Lägg på lösenordet på detta meddelande, vilket då ger dig följande; "123abcxyz"
Kryptera det sedan igen med lösenordet, vilket ger dig; "asdfghijdj"

När du sedan gör det omvända så avkrypterar du med lösenordet "123" och får "123abcxyz". Du kan då jämföra om meddelandet börjar med lösenordet eller ej - vilket det i det här fallet gör. Alltså har du angett rätt lösenord.
Du kan därmed plocka bort lösenordet från meddelandet och sedan avkrytera det igen för att slutligen få "hej 123".

Notera att detta bara är ett exempel för en lösning på hur du kan verifiera att rätt nyckel används vid avkrypteringen. Jag är bara en "vanlig" utvecklare och är ingen säkerhetsexpert/expert inom kryptografi

Visa signatur

NZXT H510 Flow MSI B450 Tomahawk MAX
AMD Ryzen 5800X3D RX 7900XTX Kingston Fury 64GB
LG C2 42" 4K@120Hz AOC Q27G2U 1440P@144Hz

Permalänk
Medlem
Skrivet av Pamudas:

Ett exempel;

Lösenord: "123"
Meddelande: "hej 123"

Kryptera meddelandet med lösenordet, det ger dig; "abcxyz"
Lägg på lösenordet på detta meddelande, vilket då ger dig följande; "123abcxyz"
Kryptera det sedan igen med lösenordet, vilket ger dig; "asdfghijdj"

När du sedan gör det omvända så avkrypterar du med lösenordet "123" och får "123abcxyz". Du kan då jämföra om meddelandet börjar med lösenordet eller ej - vilket det i det här fallet gör. Alltså har du angett rätt lösenord.
Du kan därmed plocka bort lösenordet från meddelandet och sedan avkrytera det igen för att slutligen få "hej 123".

Tack för förklaringen. Vid en snabb genomläsning av "dokumentationen", så måste man ange lösenordet i klartext för att kunna avkryptera något.

Jag kan förvisso lägga in bcrypt-strängen för lösenordet före meddelandets krypteringssträng i databasen (alltså, lösenordet hashat med bcrypt mellanslag meddelandet krypterat med AES). Kom på det nu när jag renskrev det här inlägget Ger det ett försök i morgon. Släktforskar nu.

Skrivet av Pamudas:

Notera att detta bara är ett exempel för en lösning på hur du kan verifiera att rätt nyckel används vid avkrypteringen. Jag är bara en "vanlig" utvecklare och är ingen säkerhetsexpert/expert inom kryptografi

Nä, det är samma här (som bevisat) Bra att kunna bolla med andra då.

Visa signatur

Citera mig om du vill att jag ska hitta till ditt svar.
airikr.me. Andra projekt: Keizai, Koroth, Serenum & Enc.

Permalänk
Medlem
Skrivet av Airikr:

Tack för förklaringen. Vid en snabb genomläsning av "dokumentationen", så måste man ange lösenordet i klartext för att kunna avkryptera något.

Jag kan förvisso lägga in bcrypt-strängen för lösenordet före meddelandets krypteringssträng i databasen (alltså, lösenordet hashat med bcrypt mellanslag meddelandet krypterat med AES). Kom på det nu när jag renskrev det här inlägget Ger det ett försök i morgon. Släktforskar nu.

Nä, det är samma här (som bevisat) Bra att kunna bolla med andra då.

Okej.. förtydligar lite mer då

Lösenord: 123
Meddelande: Hej

Hashat lösenord: absyhbdhuyashduasdjsaujdiasjidojasoid

Steg 1:
Kryptera meddelandet.
(resultat: 9823902j3290ijmdasjd)

Steg 2:
Hasha lösenordet och lägg på den hashade lösenordssträngen på det krypterade meddelandet;
"absyhbdhuyashduasdjsaujdiasjidojasoid#!ENC!#9823902j3290ijmdasjd"
(#!ENC!# används mellan hashet och krypterade meddelandet som exempel på hur du kan förhindra att det krypterade meddelandet också tolkas som en del av lösenordet)

Steg 3:
Kryptera meddelandet (som nu också innehåller ditt hashade lösenord) igen med lösenordet;
(resultat: jiausjdu89sahd897j821j9a98sdj89as)

Steg 4:
Ladda upp det krypterade meddelandet till din backend/databas.

När du sedan ska göra det omvända, alltså avkryptera meddelandet, så blir det följande;

Steg 1:
Hasha lösenordet som anges.
(resultat: absyhbdhuyashduasdjsaujdiasjidojasoid)

Steg 2:
Avkryptera meddelandet (jiausjdu89sahd897j821j9a98sdj89as) med lösenordet.
(resultat: absyhbdhuyashduasdjsaujdiasjidojasoid#!ENC!#9823902j3290ijmdasjd)

Steg 3:
Kontrollera om början av meddelandet (fram till din avskiljare, i det här fallet "#!ENC!#") är samma som det hash du genererade för lösenordet.
(absyhbdhuyashduasdjsaujdiasjidojasoid)

Steg 4:
Om hashet är identiskt så har du rätt lösenord.
Avkryptera det inre meddelandet (9823902j3290ijmdasjd) med lösenordet (123).
(resultat: "Hej")

Klart

Visa signatur

NZXT H510 Flow MSI B450 Tomahawk MAX
AMD Ryzen 5800X3D RX 7900XTX Kingston Fury 64GB
LG C2 42" 4K@120Hz AOC Q27G2U 1440P@144Hz

Permalänk
Medlem
Skrivet av Pamudas:

Okej.. förtydligar lite mer då

Lösenord: 123
Meddelande: Hej

Hashat lösenord: absyhbdhuyashduasdjsaujdiasjidojasoid

Steg 1:
Kryptera meddelandet.
(resultat: 9823902j3290ijmdasjd)

Steg 2:
Hasha lösenordet och lägg på den hashade lösenordssträngen på det krypterade meddelandet;
"absyhbdhuyashduasdjsaujdiasjidojasoid#!ENC!#9823902j3290ijmdasjd"
(#!ENC!# används mellan hashet och krypterade meddelandet som exempel på hur du kan förhindra att det krypterade meddelandet också tolkas som en del av lösenordet)

Steg 3:
Kryptera meddelandet (som nu också innehåller ditt hashade lösenord) igen med lösenordet;
(resultat: jiausjdu89sahd897j821j9a98sdj89as)

Steg 4:
Ladda upp det krypterade meddelandet till din backend/databas.

När du sedan ska göra det omvända, alltså avkryptera meddelandet, så blir det följande;

Steg 1:
Hasha lösenordet som anges.
(resultat: absyhbdhuyashduasdjsaujdiasjidojasoid)

Steg 2:
Avkryptera meddelandet (jiausjdu89sahd897j821j9a98sdj89as) med lösenordet.
(resultat: absyhbdhuyashduasdjsaujdiasjidojasoid#!ENC!#9823902j3290ijmdasjd)

Steg 3:
Kontrollera om början av meddelandet (fram till din avskiljare, i det här fallet "#!ENC!#") är samma som det hash du genererade för lösenordet.
(absyhbdhuyashduasdjsaujdiasjidojasoid)

Steg 4:
Om hashet är identiskt så har du rätt lösenord.
Avkryptera det inre meddelandet (9823902j3290ijmdasjd) med lösenordet (123).
(resultat: "Hej")

Klart

Jag tog bort mitt förra meddelande. Läste om ditt inlägg mycket noggrannare. Att lösa det ni är ute efter kommer tyvärr kräva oerhört mycket tankekraft från min sida då jag måste lära mig hur man "kopplar upp" sql.js med async för att kunna använda await. Om jag känner mig själv rätt, så kommer det aldrig att ske.

Påminn mig gärna igen varför man "inte får" inkludera det hashade lösenordet i länken med hjälp av JavaScript

Kan inte uttrycka mig bättre än såhär på grund av att jag är sjukt hjärntrött med yrsel och tryck i huvudet.

Snabb redigering efter soffläge
Visa signatur

Citera mig om du vill att jag ska hitta till ditt svar.
airikr.me. Andra projekt: Keizai, Koroth, Serenum & Enc.

Permalänk
Medlem
Skrivet av Airikr:

Jag tog bort mitt förra meddelande. Läste om ditt inlägg mycket noggrannare. Att lösa det ni är ute efter kommer tyvärr kräva oerhört mycket tankekraft från min sida då jag måste lära mig hur man "kopplar upp" sql.js med async för att kunna använda await. Om jag känner mig själv rätt, så kommer det aldrig att ske.

Påminn mig gärna igen varför man "inte får" inkludera det hashade lösenordet i länken med hjälp av JavaScript

Kan inte uttrycka mig bättre än såhär på grund av att jag är sjukt hjärntrött med yrsel och tryck i huvudet.

Du måste ha missförstått. Det som behöver göras är bara en förändring hur du krypterar/avkrypterar meddelandet.
Sql borde rimligtvis förbli oförändrad i din backend

Visa signatur

NZXT H510 Flow MSI B450 Tomahawk MAX
AMD Ryzen 5800X3D RX 7900XTX Kingston Fury 64GB
LG C2 42" 4K@120Hz AOC Q27G2U 1440P@144Hz

Permalänk
Medlem
Skrivet av Pamudas:

Du måste ha missförstått. Det som behöver göras är bara en förändring hur du krypterar/avkrypterar meddelandet.
Sql borde rimligtvis förbli oförändrad i din backend

Ja, jo, men man måste ju kolla om lösenordet är rätt? Det tog jag i går som att man måste kolla det när man försöker låsa upp meddelandet.

Visa signatur

Citera mig om du vill att jag ska hitta till ditt svar.
airikr.me. Andra projekt: Keizai, Koroth, Serenum & Enc.

Permalänk
Medlem
Skrivet av Airikr:

Ja, jo, men man måste ju kolla om lösenordet är rätt? Det tog jag i går som att man måste kolla det när man försöker låsa upp meddelandet.

Om hashet du skapar på klienten är samma som finns i meddelandet efter du avkrypterat första gången, så är det ju rätt lösenord. Har du avkrypterat med fel lösenord så kommer det vara helt scrambled och du kan inte tyda innehållet

Tänk ett paket.. du har din produkt i sin originalkartong, därefter lägger du originalkartongen i ett yttre emballage tillsammans med en lista över innehållet.
Du öppnar yttre emballaget och kontrollerar listan (som i då är ditt lösenord) - om det inte stämmer med vad du köpt så kommer du returnera paketet, för det är ju inte rätt.
Annars tar du glatt ur originalkartongen och öppnar för att få din produkt.

Visa signatur

NZXT H510 Flow MSI B450 Tomahawk MAX
AMD Ryzen 5800X3D RX 7900XTX Kingston Fury 64GB
LG C2 42" 4K@120Hz AOC Q27G2U 1440P@144Hz

Permalänk
Medlem

Annars tycker jag du ska kolla upp HMAC, som är "rätt" sätt att göra det hela på. Skickar lite kodexempel nedan på en simpel implementering endast med hjälp av CryptoJS

Input message: "hejsan hoppsan"
Password: "swec"
Output (encrypted): "670289e2138d14da5b0498f41adf8a3d$U2FsdGVkX1+659hX556z7DcbLhqB4J0qhPbZZShynmY=$961cf75dfaecf53b7933c8ecb04bce293204a2b55f480f9d9f6d6cb25f1ae116"

(fetstilta är meddelandet)

Kryptera med AES och inkludera HMAC;

function encryptMessage() { const message = document.getElementById('message').value; const password = document.getElementById('password').value; if (!message || !password) { alert('Please enter both the message and password.'); return; } try { // Generate a random salt const salt = CryptoJS.lib.WordArray.random(128 / 8); console.log("Salt:", salt.toString()); // Derive a key using PBKDF2 const key = CryptoJS.PBKDF2(password, salt, { keySize: 256 / 32, iterations: 1000 }).toString(); console.log("Derived Key:", key); // Encrypt the message using the derived key const encrypted = CryptoJS.AES.encrypt(message, key).toString(); console.log("Encrypted Message:", encrypted); // Generate an HMAC for integrity verification const hmac = CryptoJS.HmacSHA256(encrypted, key).toString(); console.log("HMAC:", hmac); // Combine salt, encrypted message, and HMAC const combinedMessage = salt.toString() + "$" + encrypted + "$" + hmac; document.getElementById('result').value = combinedMessage; } catch (error) { alert('Encryption failed: ' + error.message); console.error("Encryption Error:", error); } }

Avkryptera och validera HMAC;

function decryptMessage() { const combinedMessage = document.getElementById('message').value; const password = document.getElementById('password').value; if (!combinedMessage || !password) { alert('Please enter both the encrypted message and password.'); return; } try { const parts = combinedMessage.split('$'); if (parts.length !== 3) { throw new Error('Invalid format: Expected salt, encrypted message, and HMAC.'); } const salt = CryptoJS.enc.Hex.parse(parts[0]); const encryptedText = parts[1]; const hmacStored = parts[2]; console.log("Extracted Salt:", salt.toString()); console.log("Encrypted Text:", encryptedText); console.log("Stored HMAC:", hmacStored); // Derive the decryption key from the password and salt const key = CryptoJS.PBKDF2(password, salt, { keySize: 256 / 32, iterations: 1000 }).toString(); console.log("Derived Key:", key); // Verify the HMAC to check integrity const hmacCalculated = CryptoJS.HmacSHA256(encryptedText, key).toString(); if (hmacCalculated !== hmacStored) { throw new Error('Invalid password or message integrity compromised.'); } // Decrypt the message const decrypted = CryptoJS.AES.decrypt(encryptedText, key).toString(CryptoJS.enc.Utf8); if (!decrypted) { throw new Error('Decryption failed: Incorrect password or corrupted data.'); } document.getElementById('result').value = decrypted; } catch (error) { alert('Decryption failed: ' + error.message); console.error("Decryption Error:", error); } }

Dold text
Visa signatur

NZXT H510 Flow MSI B450 Tomahawk MAX
AMD Ryzen 5800X3D RX 7900XTX Kingston Fury 64GB
LG C2 42" 4K@120Hz AOC Q27G2U 1440P@144Hz

Permalänk
Medlem
Skrivet av Airikr:

Ja, jo, men man måste ju kolla om lösenordet är rätt? Det tog jag i går som att man måste kolla det när man försöker låsa upp meddelandet.

Eftersom det är end-to-end-encryption med ett av användaren givet lösenord som du försöker lösa så ska lösenordet ALDRIG skickas till servern, vare sig i klartext eller i hashad form. Lösenordsverifiering och avkryptering måste sådeles ske i frontend.

Datan som har krypterats av frontend skickas till backend som sparar undan den och genererar en unik adress för det objekt som tagits emot. Backendens roll blir med andra ord att lagra data och skapa snygga URLer för att nå (ladda ner) datan i krypterad form.

Då avkryptering behöver ske i frontend kommer alla som besöker en backend-genererad länk få ladda ner det krypterade objektet.

Bcrypt är ett villospår: resultatet av att kryptera en och samma nyckelfras, exempelvis "korv", vid två olika tillfällen kommer ge olika resultat, testa själv på exempelvis https://bcrypt-generator.com/

Vad du vill göra istället är att använda någon sorts symmetriskt krypteringssystem, till exempel Twofish eller AES för att kryptera datan, innan den skickas till backend.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Pamudas:

Annars tycker jag du ska kolla upp HMAC, som är "rätt" sätt att göra det hela på. Skickar lite kodexempel nedan på en simpel implementering endast med hjälp av CryptoJS

Input message: "hejsan hoppsan"
Password: "swec"
Output (encrypted): "670289e2138d14da5b0498f41adf8a3d$U2FsdGVkX1+659hX556z7DcbLhqB4J0qhPbZZShynmY=$961cf75dfaecf53b7933c8ecb04bce293204a2b55f480f9d9f6d6cb25f1ae116"

(fetstilta är meddelandet)

Kryptera med AES och inkludera HMAC;

function encryptMessage() { const message = document.getElementById('message').value; const password = document.getElementById('password').value; if (!message || !password) { alert('Please enter both the message and password.'); return; } try { // Generate a random salt const salt = CryptoJS.lib.WordArray.random(128 / 8); console.log("Salt:", salt.toString()); // Derive a key using PBKDF2 const key = CryptoJS.PBKDF2(password, salt, { keySize: 256 / 32, iterations: 1000 }).toString(); console.log("Derived Key:", key); // Encrypt the message using the derived key const encrypted = CryptoJS.AES.encrypt(message, key).toString(); console.log("Encrypted Message:", encrypted); // Generate an HMAC for integrity verification const hmac = CryptoJS.HmacSHA256(encrypted, key).toString(); console.log("HMAC:", hmac); // Combine salt, encrypted message, and HMAC const combinedMessage = salt.toString() + "$" + encrypted + "$" + hmac; document.getElementById('result').value = combinedMessage; } catch (error) { alert('Encryption failed: ' + error.message); console.error("Encryption Error:", error); } }

Avkryptera och validera HMAC;

function decryptMessage() { const combinedMessage = document.getElementById('message').value; const password = document.getElementById('password').value; if (!combinedMessage || !password) { alert('Please enter both the encrypted message and password.'); return; } try { const parts = combinedMessage.split('$'); if (parts.length !== 3) { throw new Error('Invalid format: Expected salt, encrypted message, and HMAC.'); } const salt = CryptoJS.enc.Hex.parse(parts[0]); const encryptedText = parts[1]; const hmacStored = parts[2]; console.log("Extracted Salt:", salt.toString()); console.log("Encrypted Text:", encryptedText); console.log("Stored HMAC:", hmacStored); // Derive the decryption key from the password and salt const key = CryptoJS.PBKDF2(password, salt, { keySize: 256 / 32, iterations: 1000 }).toString(); console.log("Derived Key:", key); // Verify the HMAC to check integrity const hmacCalculated = CryptoJS.HmacSHA256(encryptedText, key).toString(); if (hmacCalculated !== hmacStored) { throw new Error('Invalid password or message integrity compromised.'); } // Decrypt the message const decrypted = CryptoJS.AES.decrypt(encryptedText, key).toString(CryptoJS.enc.Utf8); if (!decrypted) { throw new Error('Decryption failed: Incorrect password or corrupted data.'); } document.getElementById('result').value = decrypted; } catch (error) { alert('Decryption failed: ' + error.message); console.error("Decryption Error:", error); } }

Dold text

Tack för både kodexemplen och för förklaringarna Ska se vad jag kan göra åt detta. HMAC ser lovande ut.

Skrivet av Teknocide:

Eftersom det är end-to-end-encryption med ett av användaren givet lösenord som du försöker lösa så ska lösenordet ALDRIG skickas till servern, vare sig i klartext eller i hashad form. Lösenordsverifiering och avkryptering måste sådeles ske i frontend.

Ända sedan minst 2 tillsägelser i tidigare inlägg i denna tråd, och rättade till källkoden, så har jag aldrig pratat om att kryptera eller avkryptera på servernivå Läxan lärd från mitt håll. Snälla, ta reda på fakta innan du säger något hädanefter. Om du trots detta tycker att jag har valt fel väg att gå, ladda hem källkoden, gör dina ändringar och gör sen en pull request.

Allt med säkerhetsfrågan på Enc är (vad jag vet) löst, förutom det där med var lösenordet ska lagras.

Skrivet av Teknocide:

Datan som har krypterats av frontend skickas till backend som sparar undan den och genererar en unik adress för det objekt som tagits emot. Backendens roll blir med andra ord att lagra data och skapa snygga URLer för att nå (ladda ner) datan i krypterad form.

Då avkryptering behöver ske i frontend kommer alla som besöker en backend-genererad länk få ladda ner det krypterade objektet.

Bcrypt är ett villospår: resultatet av att kryptera en och samma nyckelfras, exempelvis "korv", vid två olika tillfällen kommer ge olika resultat, testa själv på exempelvis https://bcrypt-generator.com/

Det är endast lösenordet som hashas med bcrypt. Jag sökte runt på nätet och fann en fråga på security.stackexchange.com om vad för hashmetod man ska använda sig av för att på ett säkert sätt hasha ett lösenord. bcrypt listades som ett bra alternativ, så jag la in den metoden.

Länk till det svar som markerades som korrekt: https://security.stackexchange.com/questions/211/how-to-secur...

Läste nu dock "Input password size is limited to 51 characters", så jag måste fixa till det på något sätt, utan att begränsa lösenordets längd. En lösenordsfras med 6 ord + 1 siffra där mellanrummen är ersatta med ett bindestreck (-), kan bli över 51 tecken långa (54 tecken var ett jag kollade). Lösenordsgeneratorn på Enc ger en lösenordsfras med 4 ord + bindestreck istället för mellanrum, och ingen siffra. Till synes längsta lösenordet testat: 32 tecken. Så just nu i skrivande stund behöver jag inte stressa med att åtgärda detta.

Men varför valde jag bcrypt, förutom att det är ett bra alternativ? För att man ska inte kryptera lösenord med till exempel AES. Det är bara dumt. Kryptera ett lösenord med ett annat lösenord. Said whaaaat O.o

Sen gällande "snygga URLer". Varför? Bara inte länken är meterlång (*host* Google Maps *host*) så kvittar det ju hur länken ser ut. Bara den är organiserad och fin så kvittar det, eller hur?

Skrivet av Teknocide:

Vad du vill göra istället är att använda någon sorts symmetriskt krypteringssystem, till exempel Twofish eller AES för att kryptera datan, innan den skickas till backend.

Jag använder redan AES för att kryptera och avkryptera meddelandet och eventuella filer.

Visa signatur

Citera mig om du vill att jag ska hitta till ditt svar.
airikr.me. Andra projekt: Keizai, Koroth, Serenum & Enc.

Permalänk
Medlem
Skrivet av Airikr:

Tack för både kodexemplen och för förklaringarna Ska se vad jag kan göra åt detta. HMAC ser lovande ut.

Ända sedan minst 2 tillsägelser i tidigare inlägg i denna tråd, och rättade till källkoden, så har jag aldrig pratat om att kryptera eller avkryptera på servernivå Läxan lärd från mitt håll. Snälla, ta reda på fakta innan du säger något hädanefter. Om du trots detta tycker att jag har valt fel väg att gå, ladda hem källkoden, gör dina ändringar och gör sen en pull request.

Allt med säkerhetsfrågan på Enc är (vad jag vet) löst, förutom det där med var lösenordet ska lagras.

Det är endast lösenordet som hashas med bcrypt. Jag sökte runt på nätet och fann en fråga på security.stackexchange.com om vad för hashmetod man ska använda sig av för att på ett säkert sätt hasha ett lösenord. bcrypt listades som ett bra alternativ, så jag la in den metoden.

Länk till det svar som markerades som korrekt: https://security.stackexchange.com/questions/211/how-to-secur...

Läste nu dock "Input password size is limited to 51 characters", så jag måste fixa till det på något sätt, utan att begränsa lösenordets längd. En lösenordsfras med 6 ord + 1 siffra där mellanrummen är ersatta med ett bindestreck (-), kan bli över 51 tecken långa (54 tecken var ett jag kollade). Lösenordsgeneratorn på Enc ger en lösenordsfras med 4 ord + bindestreck istället för mellanrum, och ingen siffra. Till synes längsta lösenordet testat: 32 tecken. Så just nu i skrivande stund behöver jag inte stressa med att åtgärda detta.

Men varför valde jag bcrypt, förutom att det är ett bra alternativ? För att man ska inte kryptera lösenord med till exempel AES. Det är bara dumt. Kryptera ett lösenord med ett annat lösenord. Said whaaaat O.o

Sen gällande "snygga URLer". Varför? Bara inte länken är meterlång (*host* Google Maps *host*) så kvittar det ju hur länken ser ut. Bara den är organiserad och fin så kvittar det, eller hur?

Jag använder redan AES för att kryptera och avkryptera meddelandet och eventuella filer.

Det låter som att du fortfarande är inne på att skicka lösenordet till servern och spara det i någon form, hashat/krypterat, jag tror det är källan till kommentaren från @Teknocide

Du har fått förslag från @Pamudas på hur du kan skriva en egen funktion för att verifiera att det är rätt lösenord innan decryption av datan görs. Det innebär visserligen att lösenordet finns lagrat på servern, men i det här fallet både hashat och sen krypterat vilket jag tycker är en rätt snygg lösning.

Ett annat alternativ är att titta på ett annat crypto-bibliotek som kan göra den kollen åt dig, mitt tips är Web Cryptography API vilket alla stora webläsare har implementerat.

Här finns exempelkod från en chatbot ihop med mina frågor för att komma fram till det.
https://www.phind.com/search?cache=yc1pd1qauqqqqtyjh0tlo6p6

Permalänk
Medlem
Skrivet av Xcorp:

Det låter som att du fortfarande är inne på att skicka lösenordet till servern och spara det i någon form, hashat/krypterat, jag tror det är källan till kommentaren från @Teknocide

Hur då?

I början skickade jag lösenordet till servern och hashade det med password_hash(). Då sa folket här på forumet att jag inte ska göra det, utan hasha det via JavaScript, vilket jag lyssnade på och fixade till. Nu hävdar ni att jag skickar lösenordet till servern ändå, trots att jag endast använder JavaScript för det.

Det jag gör med lösenordet i dagsläget, är att jag hashar det med bcrypt, och petar in &pass=hashsträngen-för-lösenordet till länken som man delar till mottagaren - allt via JavaScript. Jag har tagit emot er kritik och förbättrat Enc så mycket jag bara kan, utifrån vad ni har skrivit.

Eller har JavaScript blivit det nya PHP (skicka data till servern och inte hantera det på klientnivå) utan att jag har fått veta om det?

Skrivet av Xcorp:

Du har fått förslag från @Pamudas på hur du kan skriva en egen funktion för att verifiera att det är rätt lösenord innan decryption av datan görs. Det innebär visserligen att lösenordet finns lagrat på servern, men i det här fallet både hashat och sen krypterat vilket jag tycker är en rätt snygg lösning.

Håller med.

Skrivet av Xcorp:

Ett annat alternativ är att titta på ett annat crypto-bibliotek som kan göra den kollen åt dig, mitt tips är Web Cryptography API vilket alla stora webläsare har implementerat.

Här finns exempelkod från en chatbot ihop med mina frågor för att komma fram till det.
https://www.phind.com/search?cache=yc1pd1qauqqqqtyjh0tlo6p6

Tack

Visa signatur

Citera mig om du vill att jag ska hitta till ditt svar.
airikr.me. Andra projekt: Keizai, Koroth, Serenum & Enc.

Permalänk
Medlem
Skrivet av Airikr:

T.ex här där du pratar om SQL, vilket är server side.

Skrivet av Airikr:

Jag tog bort mitt förra meddelande. Läste om ditt inlägg mycket noggrannare. Att lösa det ni är ute efter kommer tyvärr kräva oerhört mycket tankekraft från min sida då jag måste lära mig hur man "kopplar upp" sql.js med async för att kunna använda await. Om jag känner mig själv rätt, så kommer det aldrig att ske.

Påminn mig gärna igen varför man "inte får" inkludera det hashade lösenordet i länken med hjälp av JavaScript

Kan inte uttrycka mig bättre än såhär på grund av att jag är sjukt hjärntrött med yrsel och tryck i huvudet.
Senast redigerat idag 02:29 Snabb redigering efter soffläge

Jag gjorde ett nytt test nu och kollde både webläsaren och med en separat HTTPS-proxy för att dubbelkolla.
Du skickar fortfarande lösenordet till server, och dessutom i klartext!
Jag är absolut ingen webutvecklare, men gissar att det är något galet i din form, ska man verkligen ange både en action och method i den?

Permalänk
Medlem
Skrivet av Xcorp:

T.ex här där du pratar om SQL, vilket är server side.

sql.js är JavaScript som kopplar upp sig till en SQLite-fil på servern via JavaScript (med andra ord, på klientnivå). Jag tog upp det för jag inte kunde tänka klart den natten. Tack vare Pamudas kommer jag inte använda sql.js.

Skrivet av Xcorp:

Jag gjorde ett nytt test nu och kollde både webläsaren och med en separat HTTPS-proxy för att dubbelkolla.
Du skickar fortfarande lösenordet till server, och dessutom i klartext!

<Uppladdad bildlänk>

Woot?! Problemet är åtgärdat! Jag får ursäkta mig. Ändringslogg: https://codeberg.org/airikr/enc/commit/4dae27d5e2733f712e2c83...

Tack för att du upptäckte detta!

Som ni även kan se i share.js så har jag kommenterat bort en fetch(). Den ska ersätta $.ajax() i samma fil så fort jag har förstått mig på fetch().

Skrivet av Xcorp:

Jag är absolut ingen webutvecklare, men gissar att det är något galet i din form, ska man verkligen ange både en action och method i den?

Jag har alltid använt action och method i form-taggen, så de skrivs med av ren och skär vana Kan dock testa mig fram när jag väl förstår hur fetch() fungerar.

Visa signatur

Citera mig om du vill att jag ska hitta till ditt svar.
airikr.me. Andra projekt: Keizai, Koroth, Serenum & Enc.

Permalänk
Medlem
Skrivet av Airikr:

Ända sedan minst 2 tillsägelser i tidigare inlägg i denna tråd, och rättade till källkoden, så har jag aldrig pratat om att kryptera eller avkryptera på servernivå Läxan lärd från mitt håll. Snälla, ta reda på fakta innan du säger något hädanefter. Om du trots detta tycker att jag har valt fel väg att gå, ladda hem källkoden, gör dina ändringar och gör sen en pull request.

Varför så otrevlig ton? Jag lindade kanske inte in mitt budskap men avsikten var inte att säga åt dig att "RTFM".

Citat:

Allt med säkerhetsfrågan på Enc är (vad jag vet) löst, förutom det där med var lösenordet ska lagras.

Det är just det jag menar, du ska ju inte lagra lösenordet någonstans, eftersom det bara ska finnas hos den som skrev meddelandet och den som ska läsa det.

Citat:

Det är endast lösenordet som hashas med bcrypt. Jag sökte runt på nätet och fann en fråga på security.stackexchange.com om vad för hashmetod man ska använda sig av för att på ett säkert sätt hasha ett lösenord. bcrypt listades som ett bra alternativ, så jag la in den metoden.

Bcrypt är ett säkrare (tekniskt sett mer kostsamt) sätt för att hasha lösenord, det stämmer, men det är det ohashade lösenordet som används för kryptera och avkryptera datan, så varför hasha lösenordet alls?

Citat:

Men varför valde jag bcrypt, förutom att det är ett bra alternativ? För att man ska inte kryptera lösenord med till exempel AES. Det är bara dumt. Kryptera ett lösenord med ett annat lösenord. Said whaaaat O.o

Som sagt, om det hashade lösenordet aldrig används så är det väl meningslöst att hasha det till att börja med. Missar jag något här?

Citat:

Sen gällande "snygga URLer". Varför? Bara inte länken är meterlång (*host* Google Maps *host*) så kvittar det ju hur länken ser ut. Bara den är organiserad och fin så kvittar det, eller hur?

Jag använder redan AES för att kryptera och avkryptera meddelandet och eventuella filer.

Min poäng här var att backendens jobb består i två saker:
1. Att lagra krypterad data och
2. Ge ut en referensnyckel till den krypterade datan, så att en läsare kan nå den genom en "snygg" URL.

Vad som är "snyggt" är ju subjektivt så klart, men jag menade någon sorts hash som unikt identifierar den lagrade datan.

Visa signatur

Kom-pa-TI-bilitet