greeenn
Goto Top

Passwörter sicher im Source Code hinterlegen

Hi,

hat jemand eine Idee wie man ein Passwort sicher im Code hinterlegen kann ohne das es dort im Klartext steht?

Das ganze sollte in C# machbar sein.

Gibt es dafür irgendwelche Funktionen?

Content-ID: 1514194552

Url: https://administrator.de/contentid/1514194552

Ausgedruckt am: 23.11.2024 um 14:11 Uhr

fisi-pjm
fisi-pjm 16.11.2021 um 13:24:05 Uhr
Goto Top
Irgendwelche Funktionen ist ein gutes Stichwort.
Das Psswort einfach in einen String schreiben würde ich vermeiden. Aber die Kannst z.b. eine Passwort Funktion schreiben die die als Result einen String liefert und den in sich über z.B. Schleifen zusammen baut. Das ist wesentlich komplexer zu dekompilieren als ein einfacher String.

Gruß
PJM
NordicMike
NordicMike 16.11.2021 um 13:25:28 Uhr
Goto Top
1) Du kannst das Passwort in eine Datei aussondern und includen. Die Datei darf dann nicht vom User gesehen werden, also in einen geschützten Bereich schieben.

2) Oder su verbindest mit ssh keys und brauchst kein Passwort mehr. Das kommt auf die Anwendung an.
lcer00
lcer00 16.11.2021 um 13:26:47 Uhr
Goto Top
Hallo,

wenn es nur unlesbar sein soll, ist das easy. Da reicht z.B. eine einfache Caesar Chiffre.
https://isolution.pro/de/t/cryptography-with-python/cryptography-with-py ...

Wenn das sicher sein soll, geht es im Grunde nicht, da irgendwann einmal das Password an die Endanwendung übergeben werden muss und genau zu diesem Zeitpunkt ja im Speicher liegt.

Grüße

lcer
lcer00
lcer00 16.11.2021 um 13:30:50 Uhr
Goto Top
Hallo,
Zitat von @NordicMike:

2) Oder su verbindest mit ssh keys und brauchst kein Passwort mehr. Das kommt auf die Anwendung an.
Was unterscheidet diesbezüglich hier den den SSH-Key von einem Passwort?

Grüße

lcer
148848
148848 16.11.2021 um 13:35:45 Uhr
Goto Top
Hallo,

reden wir hier von einer Passwort Funktion oder möchtest du Secrets für die Anwendung selbst speichern? Letzters sollte man definitiv nicht im Code speichern sondern in Konfigurationsdateien.

https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-s ...

MfG
NetzwerkDude
NetzwerkDude 16.11.2021 um 13:38:22 Uhr
Goto Top
Für C#:
Data Protection API (DPAPI)
https://docs.microsoft.com/en-us/previous-versions/ms995355(v=msdn.10)

Damit wird dein Passwort in z.B. einer Datei abgelegt und dabei so verschlüsselt das "dein useraccount" (alternativ der maschinenaccount) es entschlüsseln kann - damit kannst du es nutzen solange zu in windows eingeloggt bist.
NordicMike
NordicMike 16.11.2021 um 13:46:46 Uhr
Goto Top
Was unterscheidet diesbezüglich hier den den SSH-Key von einem Passwort?
Dass der Key z.B. Passwortgeschützt ist und z.B. von OpenSSH unsichtbar in den Tiefen des Systems hinterlegt ist. So kann es keiner verwenden, wenn er sich den Key einfach kopiert.
lcer00
lcer00 16.11.2021 um 13:54:33 Uhr
Goto Top
Hallo,
Zitat von @NordicMike:

Was unterscheidet diesbezüglich hier den den SSH-Key von einem Passwort?
Dass der Key z.B. Passwortgeschützt ist und z.B. von OpenSSH unsichtbar in den Tiefen des Systems hinterlegt ist. So kann es keiner verwenden, wenn er sich den Key einfach kopiert.
Wenn man davon ausgeht, dass der User eine Benutzerkennung mit Passwort - oder eben einen ssh-Key - besitzt, die von der Software (mit)verwendet werden soll, wäre das natürlich ein guter Weg, genau wie @NetzwerkDude Data Protection API (DPAPI).

Leider haben wir keine weiteren Infos zum Einsatzszenario. Ich hatte eher an Client-Server Anwendungen gedacht, bei denen die Software auf z.B. eine API zugreifen soll, der Nutzer aber ohne die Software nicht.

Grüße

lcer
148848
148848 16.11.2021 aktualisiert um 14:09:30 Uhr
Goto Top
Zitat von @NordicMike:

Was unterscheidet diesbezüglich hier den den SSH-Key von einem Passwort?
Dass der Key z.B. Passwortgeschützt ist und z.B. von OpenSSH unsichtbar in den Tiefen des Systems hinterlegt ist. So kann es keiner verwenden, wenn er sich den Key einfach kopiert.

Dann kann die Software blöderweise auch nicht den Key verwenden. Entweder man hinterlegt das Passwort des Keys in der Software (womit man wieder vor dem Anfangsproblem steht) oder man übergibt das Passwort als Parameter bei jedem Start der Software (wobei dann das Passwort als statische Variable im Programm Code hinterlegt ist, was ebenfalls Bad Practice ist - egal ob hashed oder in klartext).

Edit: Gerade wieder den richtigen TechNet Artikel gefunden, welches das Thema konkret behandelt und wie man das in der .NET Welt umsetzt: https://docs.microsoft.com/en-us/aspnet/core/security/app-secrets?view=a ...
lcer00
lcer00 16.11.2021 um 14:15:02 Uhr
Goto Top
Hallo,

um es kurz zu machen - Passwörter gehören nicht in den Sourcecode.

Die Sicherheitsempfehlungen gehen alle dahin, zu überprüfen, ob Benutzer und Computer vertrauenswürdig sind. Ein einkompiliertes oder gar geskriptetes Passwort unterläuft all diese Sicherheitsstrategien.

Das jedes Programm läuft unter einem Benutzerkonto (sogar bei Linux face-smile ). Und darüber kann man dann den Zugriff erlauben - oder eben nicht.

Stichwort: Zero-Trust - Beispiel Google: https://cloud.google.com/beyondcorp/

Fragen nach "Passwort-Im-Programm" stellen sich nur bei schlecht geplanten Anwendungen, bei denen man zwar die Programmfunktionalität, nicht aber die Sicherheit bedacht hat.

Grüße

lcer
Lochkartenstanzer
Lochkartenstanzer 16.11.2021 um 14:57:27 Uhr
Goto Top
Zitat von @GreeeNn:

Hi,

hat jemand eine Idee wie man ein Passwort sicher im Code hinterlegen kann ohne das es dort im Klartext steht?


Das ist nicht möglich. Auch wenn du es noch so verschleiert, solange Du ohne Benutzerunteraktion oder Tokens, aus denen Du etwas ausliest machst, kann man es immer rekonstruieren.

Benutz halt ein TPM oder Kryptostick, wenn Du sichergehen willst.

lks
Daemmerung
Daemmerung 16.11.2021 um 20:34:43 Uhr
Goto Top
hawiwo
hawiwo 17.11.2021 um 11:06:33 Uhr
Goto Top
ich hab mir
https://github.com/ddokkaebi/Blowfish
geklaut und noch nicht bereut.
GNULinux
GNULinux 18.11.2021 aktualisiert um 10:04:44 Uhr
Goto Top
Kurz: Das ganze ist nicht wirklich sicher machbar. Du kannst lediglich den Aufwand etwas erhöhen. Trotzdem hat der Client zur Verbindung das Klartext-Passwort, das man abgreifen kann. Wirklich sicher ist nur ein Wrapper, der serverseitig unter deiner Kontrolle liegt. Beispiel: Du willst auf eine MySQL-Datenbank zugreifen. Dafür schreibst du dir eine API, ASP.NET Core/PHP oder was auch immer. Das Programm verbindet sich zu dieser API und hat nicht mehr das DB Passwort.

Da du nur sehr spärlich beschrieben hast was du machen möchtest, müsstest du nun selbst schauen, wie du das auf deinen Anwendungszweck übertragen kannst.

Zitat von @hawiwo:

ich hab mir
https://github.com/ddokkaebi/Blowfish
geklaut und noch nicht bereut.

Da gibt es nichts zu klauen, das steht unter einer CC Lizenz face-wink
Aber viel wichtiger: Das ist eine stinknormale symmetrische Verschlüsselung. Du könntest genau so gut AES oder jede andere als halbwegs sicher anerkannte Verschlüsselung nehmen, die Grundproblematik bleibt die gleiche: Es gibt einen Schlüssel, der im Quellcode steht. Den findet man mit einer Stringsuche schnell und ist damit nicht übermäßig sicher. Dein Programm hat also bisher wohl nur keiner mit böswilligen Absichten auseinander genommen face-smile
GreeeNn
GreeeNn 18.11.2021 um 11:54:28 Uhr
Goto Top
Hi @148848


Zitat von @148848:

reden wir hier von einer Passwort Funktion oder möchtest du Secrets für die Anwendung selbst speichern? Letzters sollte man definitiv nicht im Code speichern sondern in Konfigurationsdateien.


Das Programm muss während der Laufzeit die Identität eines anderen AD Benutzers annehmen für Berechtigungen.
Ich will das Passwort aber nicht als String im Code stehen haben.
GreeeNn
GreeeNn 18.11.2021 um 12:01:28 Uhr
Goto Top
Moin @lcer00,

bin da ganz deiner Meinung.

Um das Programm näher zu beschreiben:

Das Programm muss während der Laufzeit die Identität eines anderen AD Benutzers annehmen um gewisse Berechtigungen zu erhalten.
Der Benutzer dessen Identität angenommen wird wurde extra für den Anwendungsfall angelegt und hat auch nur die Berechtigungen um das zu tun was das Programm erledigen soll.

Da ich aber das Kennwort für den Benutzer nicht im Code haben möchte habe ich ja gefragt ob jemand dazu eine Idee hat.

LG
lcer00
lcer00 18.11.2021 um 12:04:39 Uhr
Goto Top
Hallo,
Zitat von @GreeeNn:

Das Programm muss während der Laufzeit die Identität eines anderen AD Benutzers annehmen für Berechtigungen.
Und das ist dann der sicherheitstechnische Konzeptionsfehler / Sicherheitslücke. Besser wäre es, hier die Benutzerberechtigungen zu verwenden.

grüße

lcer
godlie
godlie 18.11.2021 um 12:10:33 Uhr
Goto Top
@GreeeNn
So etwas bildet man nicht in einem Programm ab, sowas wird in einem Backend abgebildet.
Dann brauch man sich um Passwörter im SourceCode keine Sorgen machen ........