Ahoj.
Tak zajímavě se rozjela diskuze o obtížném dešifrování, doufám, že stejně dobře mi poradíte i v tomto případě. Potřebuju bezpečně přenést heslo/klíče z jednoho počítače na druhý, který má bohužel jednu zásadní nevýhodu. Je pořád stejné. Ale mělo by se vždy po použití smazat. Přesněji je součástí jiného většího hesla/klíče a slouží k tomu, aby k odemčení zašifrovaných dat byly vždy dvě strany. Ta druhá strana zároveň svou částí hesla autorizuje požadavek, který zasílá, tedy mělo by být nemožné, aby se za tuto stranu někdo vydával. Je samozřejmě jisté že,
1. přenášet mohu pochopitelně po zabezpečeném kanále (SSL/TSL)
2. mohu k autentifikaci použít digitální podpis.
I tak to ale znamená, že přijímaci strana musí vědět, že nebyla oklamána. Ideální bylo, kdyby součástí požadavku bylo i heslo k odemčení zabezpečených dat nutných k dokončení akce.
Příklad.
Mám dva stroje.
1. agent
2. master
Agent se neustále chodí ptát mastera na úkoly a pokud se objeví úkol, master mu v odpovědi zašle parametry úkolu. Předpokládá se, že agent je zodpovědný za provedení zabezpečené operace například s citlivými daty (třeba výplatu peněz).
Je mi blbý do odpovědi dávat přímo to heslo, i když bude putovat zabezpečeným kanálem. Lepší by bylo, kdyby heslo bylo předáno po kanálu nějak fikaně. Třeba jako OTP autentifikace. Ale je potřeba nakonec získat vlastní text hesla, tedy nestačí jen potvrzení Ano/Ne, zda druhá strana se správně identifikovala.
Opět jsem nejprve použil googla, abys se pokusil najít řešení vlastními silami. Dovedlo mě to k D/H key exchange a RSA.
- Agent pošle na mastera požadavek a s ním vyšle náhodný řetězec jako challenge
- Master kromě toho, že sestaví odpověď, tak provede výpočet X = F(a,b,s), kde X heslo, který chci přenést, F je hledaná funkce, a je challenge, s je tajná hodnota, kterou mohou znát obě strany, ale by se X nemělo nechat spočítat. Server vypočítá b a odešle ho v odpovědi.
- agent přijme b, hodnotu a zná, spočítá F(a,b,s) a získá X. to použije na odemčení zabezpečených dat a pak X z paměti vymaže.
Pokud by vládu nad agentem převzal útočník, nebude schopen spočítat
b, protože nezná
x. I kdyby se mu podařilo agenta kompromitovat (třeba pomocí jiné chyby) a vyřadil by kontrolu autorizace požadavku, tak bez správného hesla a tedy hodnoty
x nezmůže nic.
Otázka zní, jaká je funkce F.
Napadla mě primitivní odpověď jako příklad F(a,b,s) = a XOR b XOR s. Ze znalosti X,a,s jsem schopen spočítat b. Ze znalosti a,b,s jsem schopen spočítat X. Ovšem bez jedne z obou proměnných X neodvodím.
A otázka. Kde bych hledal podobnou funkci, ale s mnohem lepší implementací. Cílem je, aby v případě, že útočník získá jedno nebo i oba řetězce (například z komunikace), aby i tak nebyl schopen spočítat X a zejména pak simulovat mastera a tím ho donotit provést neautorizovanou operaci.
PS: není to jediné zabezpečení