Ik werk aan een applicatie waarmee gebruikers hun eigen content kunnen maken. Voor het gemak, laten we zeggen dat de gebruikers een soort powerpoint presentaties maken. Deze presentaties zijn misschien ook voor andere mensen interessant, en ik ben bezig om een soort online "winkel" te maken waar men hun creaties kunnen delen. De bedoeling is dat de gebruikers zelf kunnen kiezen of ze hun presentatie gratis aanbieden of er geld voor vragen. Ik heb een server online waar de presentaties naar geupload worden, en waarvan ze dan door andere gebruikers weer gedownload worden.
Ik probeer nu een manier te verzinnen waarop ik ervoor kan zorgen dat mensen de presentaties van anderen niet zomaar kunnen delen (oftewel, Pietje koopt een presentatie van Jantje en stuurt deze daarna naar 15 mensen door en deelt de kosten). Ik wil een presentatie dus kunnen koppelen aan de gebruiker die deze gekocht heeft, zodat hij niet door anderen te gebruiken is.
Een belangrijk punt: het opslaan en laden van een presentatie in de client moet ook kunnen werken zonder verbinding met de server. Mocht de server een keer down zijn of de gebruiker zonder internet zitten dan wil ik niet dat de applicatie onbruikbaar is.
Ik ben een klein beetje bekend met encryptie, maar waarschijnlijk niet genoeg om dit op een slimme manier op te lossen. Ik heb het volgende bedacht:
- Ik geef elke gebruiker een eigen unieke "key" en sla deze op in de database op de server.
- De gebruiker moet inloggen op de client applicatie om presentaties te kunnen uploaden. Tijdens inloggen kan de client de key van de gebruiker ophalen.
- Bij het uploaden wordt de presentatie file versleuteld met deze key via symmetrische encryptie. De versleutelde versie wordt opgeslagen en naar de server geupload.
- Bij het inladen van een presentatie file wordt de file ontsleuteld met de key van de ingelogde gebruiker. Alleen als de key overeenkomt (oftewel, als het dezelfde gebruiker is) zal de presentatie dus kunnen laden.
- Als een andere gebruiker een presentatie wil downloaden, dan wordt de file op de server eerst ontsleuteld met de key van de eigenaar (deze is op de server natuurlijk bekend). Daarna wordt hij weer versleuteld met de key van de koper. Op deze manier kan alleen de koper de file laden.
(Ik heb ook beschikking over asymmetrische encryptie; de server heeft een private key en de client kent een public key welke we al voor andere doeleinden gebruiken. De files bevatten echter afbeeldingen etc en kunnen vaak wel 50+ MB groot zijn. Volgens mij is asymmetrische encryptie dus geen optie, in ieder geval niet direct.)
Volgens mij moet dit werken; de file kan alleen geopend worden als hij opgeslagen (of gedownload) is door de gebruiker waarmee hij encrypted is. Zowel opslaan als inladen van een presentatie werkt ook offline als de key lokaal bekend is.
Maar ik zie een groot probleem... De unieke key van de gebruiker moet op de client opgeslagen worden. Een slimme gebruiker kan doorhebben hoe de boel werkt en gewoon zijn key opzoeken en deze delen met zijn vrienden. Zijn vrienden kunnen hun key dan veranderen en alsnog presentaties openen die niet van hunzelf zijn.
Hoe voorkom ik dit? Dit lijkt me een probleem dat al opgelost moet zijn... Maar ik kan geen manier verzinnen om dit te laten werken. Het enige wat ik kon bedenken is om de unieke key op een of andere manier het ID van een user te laten bevatten. Stom voorbeeld: gewoon een random string met het ID er achter geplakt. Bij het ontsleutelen kan dan gewoon gekeken worden of het ID in de key overeenkomt met het ID van de huidige gebruiker. Zo niet dan klopt er iets niet. Maar hier hetzelfde probleem: ook het ID moet gewoon lokaal in een database ofzo staan, en is dus in principe ook aan te passen...
Kan ik iets bereiken met de asymmetrische encryptie? Ik kan het niet bedenken...
Ben ik gewoon te moeilijk aan het doen? Ik kan me niet voorstellen dat ik gebruikers krijg die slim genoeg zijn om hun key te zoeken en aan te passen, maar het is in principe natuurlijk mogelijk en als er een goeie manier is om dit te voorkomen dan pas ik dat graag toe.
Ik probeer nu een manier te verzinnen waarop ik ervoor kan zorgen dat mensen de presentaties van anderen niet zomaar kunnen delen (oftewel, Pietje koopt een presentatie van Jantje en stuurt deze daarna naar 15 mensen door en deelt de kosten). Ik wil een presentatie dus kunnen koppelen aan de gebruiker die deze gekocht heeft, zodat hij niet door anderen te gebruiken is.
Een belangrijk punt: het opslaan en laden van een presentatie in de client moet ook kunnen werken zonder verbinding met de server. Mocht de server een keer down zijn of de gebruiker zonder internet zitten dan wil ik niet dat de applicatie onbruikbaar is.
Ik ben een klein beetje bekend met encryptie, maar waarschijnlijk niet genoeg om dit op een slimme manier op te lossen. Ik heb het volgende bedacht:
- Ik geef elke gebruiker een eigen unieke "key" en sla deze op in de database op de server.
- De gebruiker moet inloggen op de client applicatie om presentaties te kunnen uploaden. Tijdens inloggen kan de client de key van de gebruiker ophalen.
- Bij het uploaden wordt de presentatie file versleuteld met deze key via symmetrische encryptie. De versleutelde versie wordt opgeslagen en naar de server geupload.
- Bij het inladen van een presentatie file wordt de file ontsleuteld met de key van de ingelogde gebruiker. Alleen als de key overeenkomt (oftewel, als het dezelfde gebruiker is) zal de presentatie dus kunnen laden.
- Als een andere gebruiker een presentatie wil downloaden, dan wordt de file op de server eerst ontsleuteld met de key van de eigenaar (deze is op de server natuurlijk bekend). Daarna wordt hij weer versleuteld met de key van de koper. Op deze manier kan alleen de koper de file laden.
(Ik heb ook beschikking over asymmetrische encryptie; de server heeft een private key en de client kent een public key welke we al voor andere doeleinden gebruiken. De files bevatten echter afbeeldingen etc en kunnen vaak wel 50+ MB groot zijn. Volgens mij is asymmetrische encryptie dus geen optie, in ieder geval niet direct.)
Volgens mij moet dit werken; de file kan alleen geopend worden als hij opgeslagen (of gedownload) is door de gebruiker waarmee hij encrypted is. Zowel opslaan als inladen van een presentatie werkt ook offline als de key lokaal bekend is.
Maar ik zie een groot probleem... De unieke key van de gebruiker moet op de client opgeslagen worden. Een slimme gebruiker kan doorhebben hoe de boel werkt en gewoon zijn key opzoeken en deze delen met zijn vrienden. Zijn vrienden kunnen hun key dan veranderen en alsnog presentaties openen die niet van hunzelf zijn.
Hoe voorkom ik dit? Dit lijkt me een probleem dat al opgelost moet zijn... Maar ik kan geen manier verzinnen om dit te laten werken. Het enige wat ik kon bedenken is om de unieke key op een of andere manier het ID van een user te laten bevatten. Stom voorbeeld: gewoon een random string met het ID er achter geplakt. Bij het ontsleutelen kan dan gewoon gekeken worden of het ID in de key overeenkomt met het ID van de huidige gebruiker. Zo niet dan klopt er iets niet. Maar hier hetzelfde probleem: ook het ID moet gewoon lokaal in een database ofzo staan, en is dus in principe ook aan te passen...
Kan ik iets bereiken met de asymmetrische encryptie? Ik kan het niet bedenken...
Ben ik gewoon te moeilijk aan het doen? Ik kan me niet voorstellen dat ik gebruikers krijg die slim genoeg zijn om hun key te zoeken en aan te passen, maar het is in principe natuurlijk mogelijk en als er een goeie manier is om dit te voorkomen dan pas ik dat graag toe.