Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Sichere Datenübertragung an API
Kriz
myCSharp.de - Member



Dabei seit:
Beiträge: 115

Themenstarter:

Sichere Datenübertragung an API

beantworten | zitieren | melden

Servus,

folgender Sachverhalt:
Ich habe eine API, an die ich per HttpPost im Body eine Ausweisnummer und einen PIN schicke. Auf der API wird dann geschaut, ob Ausweisnummer und PIN zusammen passen und eine dem entsprechende Antwort geschickt.

Aktuell ver- und entschlüssele ich die Daten mittels CodeSnippets von Stackoverflow:


static internal class Crypto
    {
        static string pw = "1234";
        // Define the secret salt value for encrypting data
        private static readonly byte[] salt = Encoding.ASCII.GetBytes("Das Salz in der Suppe");

        internal static string Encrypt(string textToEncrypt)
        {
            var algorithm = GetAlgorithm(pw);

            //Anything to process?
            if (textToEncrypt == null || textToEncrypt == "") return "";

            byte[] encryptedBytes;
            using (ICryptoTransform encryptor = algorithm.CreateEncryptor(algorithm.Key, algorithm.IV))
            {
                byte[] bytesToEncrypt = Encoding.UTF8.GetBytes(textToEncrypt);
                encryptedBytes = InMemoryCrypt(bytesToEncrypt, encryptor);
            }
            return Convert.ToBase64String(encryptedBytes);
        }

        /// <summary>
        /// Takes the given encrypted text string and decrypts it using the given password
        /// </summary>
        /// <param name="encryptedText">Encrypted text.</param>
        /// <param name="encryptionPassword">Encryption password.</param>
        internal static string Decrypt(string encryptedText, string encryptionPassword)
        {
            var algorithm = GetAlgorithm(encryptionPassword);

            //Anything to process?
            if (encryptedText == null || encryptedText == "") return "";

            byte[] descryptedBytes;
            using (ICryptoTransform decryptor = algorithm.CreateDecryptor(algorithm.Key, algorithm.IV))
            {
                byte[] encryptedBytes = Convert.FromBase64String(encryptedText);
                descryptedBytes = InMemoryCrypt(encryptedBytes, decryptor);
            }
            return Encoding.UTF8.GetString(descryptedBytes);
        }

        /// <summary>
        /// Performs an in-memory encrypt/decrypt transformation on a byte array.
        /// </summary>
        /// <returns>The memory crypt.</returns>
        /// <param name="data">Data.</param>
        /// <param name="transform">Transform.</param>
        private static byte[] InMemoryCrypt(byte[] data, ICryptoTransform transform)
        {
            MemoryStream memory = new MemoryStream();
            using (Stream stream = new CryptoStream(memory, transform, CryptoStreamMode.Write))
            {
                stream.Write(data, 0, data.Length);
            }
            return memory.ToArray();
        }

        /// <summary>
        /// Defines a RijndaelManaged algorithm and sets its key and Initialization Vector (IV) 
        /// values based on the encryptionPassword received.
        /// </summary>
        /// <returns>The algorithm.</returns>
        /// <param name="encryptionPassword">Encryption password.</param>
        private static RijndaelManaged GetAlgorithm(string encryptionPassword)
        {
            // Create an encryption key from the encryptionPassword and salt.
            var key = new Rfc2898DeriveBytes(encryptionPassword, salt);

            // Declare that we are going to use the Rijndael algorithm with the key that we've just got.
            var algorithm = new RijndaelManaged();
            int bytesForKey = algorithm.KeySize / 8;
            int bytesForIV = algorithm.BlockSize / 8;
            algorithm.Key = key.GetBytes(bytesForKey);
            algorithm.IV = key.GetBytes(bytesForIV);
            return algorithm;
        }

    }

Nun ist es so, dass dieser API-Endpunkt auch für andere Nutzer zugänglich gemacht werden soll.
Nun wird ja nicht jeder mit C# arbeiten, wie komme ich nun mit den zukünftigen Nutzern auf einen Nenner, was die Verschlüsselung angeht?

Ich bin im Thema Verschlüsselung noch ein absoluter Anfänger, daher habt Nachsicht, falls es eine Anfängerfrage ist.

Danke im Vorraus!
Kriz
private Nachricht | Beiträge des Benutzers
JimStark
myCSharp.de - Member

Avatar #dOpLzh7hN1az1g0eGRc0.jpg


Dabei seit:
Beiträge: 306

beantworten | zitieren | melden

Greifst du auf die API überhaupt verschlüsselt, über https zu?
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von JimStark am .
private Nachricht | Beiträge des Benutzers
Kriz
myCSharp.de - Member



Dabei seit:
Beiträge: 115

Themenstarter:

beantworten | zitieren | melden

Ja, geht über https
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Member



Dabei seit:
Beiträge: 1.987
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

Wenn du schon per https zgreifst, kannst du dir zusätzliche Verschlüsselung sparen.
https ist Transport Verschlüsselung!
Dein Body wird dabei über eine gesicherte Verbindung übertragen.

Hypertext Transfer Protocol Secure

T-Virus
Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
private Nachricht | Beiträge des Benutzers
Kriz
myCSharp.de - Member



Dabei seit:
Beiträge: 115

Themenstarter:

beantworten | zitieren | melden

Alles klar, danke für die Hilfe!
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15.852

beantworten | zitieren | melden

HTTPS ist der korrekte Weg; und ja, der Body wird dabei verschlüsselt - URL Parameter aber nicht.
Daher doppelt drauf achten, dass alles im Body ist.

Ansonsten auch den Tipp, dass Du das HTTPS Zertifikat kontrollieren kannst, obs das richtige ist.
Nennt sich Public Key Pinning. Weil nur weil HTTPS eingesetzt wird heisst das ja nicht, dass der Absender auch das richtige Zertifikat schickt -> Man in the Middle Attack.
private Nachricht | Beiträge des Benutzers