none
Verschlüsselung von Daten fester Länge RRS feed

  • Frage

  • Hallo zusammen,

    wie verschlüsselt man denn am besten Kreditkarten-Daten? Ich muss in diesem FAll die Daten nicht wieder entschlüsseln, sondern die Daten sollen nur noch im Klartext vorliegen. Wenn ich die Karten-Nr. nun z. b. mit SHA oder MD5 verschschlüssel, dann finde ich es nicht besonders aufwendig mir eine Tabelle mit Karten-Nr und zugehörigem MD5 Wert anzulegen. Ohne es jetzt ausprobiert zu haben, glaube ich, dass mein Rechner diese Tabelle in 2 Tagen erstellt hätte.

    Wie aber sollte man es dann machen?

    Volker
    Dienstag, 7. Juni 2011 16:32

Antworten

  • servus,

    Die Idee von Stefan scheint mir aber richtig zu sein. Ich wollte den Salt in der Kreditkarten-Tabelle unterbringen; auf die Idee den zum Kunden zu packen war ich noch nicht gekommen.

    Geht auch mit Salt bei den Fischen:

    USE Test ;
    GO
    
    CREATE TABLE Customer
        (
          ID INT NOT NULL ,
          CustomerName NVARCHAR(255) NOT NULL ,
          CustomerSalt NVARCHAR(255) NOT NULL ,
          CONSTRAINT PK_Customer PRIMARY KEY ( ID )
        ) ;
    
    CREATE TABLE CreditCardNumber
        (
          idCustomer INT NOT NULL ,
          NumberHash VARBINARY(128) NOT NULL ,
          NumberSalt NVARCHAR(255) NOT NULL ,
          CONSTRAINT UQ_CreditCardNumber UNIQUE ( NumberHash )
        ) ;
    GO
    
    INSERT  INTO Customer
    VALUES  ( 1, N'Stefan', N'dsfiuj23498ujk' ) ,
            ( 2, N'Volker', N'kldgfkdfjg2340' ) ;
    
    INSERT  INTO CreditCardNumber
    VALUES  ( 1, HASHBYTES('SHA1', N'1234 5678 9012 3456' + N'dsfiuj23498ujk' + N'retgrtejt3142'), N'retgrtejt3142' ) ,
            ( 1, HASHBYTES('SHA1', N'5678 9012 3456 1234' + N'dsfiuj23498ujk' + N'rrtzgfds98u232'), N'rrtzgfds98u232' ) ,
            ( 2, HASHBYTES('SHA1', N'9012 3456 1234 5678' + N'kldgfkdfjg2340' + N'fdgk4352314'), N'fdgk4352314' ) ;
    GO
    
    -- Search for an credit card number.
    DECLARE @CreditCardNumber NVARCHAR(255) = N'1234 5678 9012 3456' ;
    
    SELECT  C.* ,
            CCN.*
    FROM    Customer C
            INNER JOIN CreditCardNumber CCN ON C.ID = CCN.idCustomer
    WHERE   CCN.NumberHash = HASHBYTES('SHA1', @CreditCardNumber + C.CustomerSalt + CCN.NumberSalt) ;
    GO
    
    DROP TABLE Customer ;
    DROP TABLE CreditCardNumber ;
    GO

    Microsoft MVP Office Access
    https://mvp.support.microsoft.com/profile/Stefan.Hoffmann
    Mittwoch, 8. Juni 2011 14:57

Alle Antworten

  • hi,

    kannst du bitte genauer beschreiben was du machen willst? Es ist ein bischen widersprüchlich.

    Wie können Daten "nur noch im Klartext vorliegen", wenn sie nicht entschlüsselt werden?

    MD5/SHA sind Hash-Algorithmen zur Erzeugung von Finger-Prints da, nicht zur Verschlüsselung. Der korrekte Umgang mir diesen schreibt schon fast zwingend die Verwendung von Salts vor. D.h. jedes Datum hat sein eigenes Salt, damit bleibt zwar ein Datum angreifbar, aber ein Angriff auf alle ist damit in weite Ferne gerückt.


    Microsoft MVP Office Access
    https://mvp.support.microsoft.com/profile/Stefan.Hoffmann
    Mittwoch, 8. Juni 2011 08:34
  • Hallo Stefan,

    an was ich da gedacht habe als ich die verschlüsselten Daten nur im Klartext lesen wollte kann ich nicht mehr sagen. Ist ja wie Schlittschuhfahren auf der Sandbank.

    Zum Thema:
    Ich habe Kreditkartendaten, die bei uns gespeichert werden und einem Kunden zugeornet werden sollen und der Kunde über diese (verschlüsselte) Nummer identifiziert werden soll. Zur Kreditkarten-Abrechnung werden die Daten nicht benötigt, so dass eine Entschlüsselung nicht notwendig ist. Daher auch der Ansatz SHA/MD5, da der Hashwert zur Identifizierung ausreichen würde.


    Volker

    Mittwoch, 8. Juni 2011 11:23
  • Hallo Volker,

    da hätte ich etwas anzubieten. Schau mal hier: http://social.msdn.microsoft.com/Forums/de-DE/vbasicexpresseditionde/thread/ba605263-4cc2-4923-8f64-ecf57053daaf

    Da  findest dU 2 functions DecryptData und EncryptData zum Verschlüsseln und Entschlüsseln von Texten.

    Vielleicht hilft Dir das weiter.

    schöne Grüße Ellen


    Ich benutze/ I'm using VB2008 & VB2010
    Mittwoch, 8. Juni 2011 12:43
  • hi Volker,

    Ich habe Kreditkartendaten, die bei uns gespeichert werden und einem Kunden zugeornet werden sollen und der Kunde über diese (verschlüsselte) Nummer identifiziert werden soll.

    Okay. D.h. anhand einer eingegebenen Kreditkartennummer soll der Kunde gefunden werden ohne das die Kreditkartennummer selbst gespeichert wird. Dafür ist eine Hash-Funktion wohl ausreichend. Z.B.

    USE Test ;
    GO
    
    CREATE TABLE Customer
        (
          ID INT NOT NULL ,
          CustomerName NVARCHAR(255) NOT NULL ,
          CustomerSalt NVARCHAR(255) NOT NULL ,
          CONSTRAINT PK_Customer PRIMARY KEY ( ID )
        ) ;
    
    CREATE TABLE CreditCardNumber
        (
          idCustomer INT NOT NULL ,
          NumberHash VARBINARY(128) NOT NULL ,
          CONSTRAINT UQ_CreditCardNumber UNIQUE ( NumberHash )
        ) ;
    GO
    
    INSERT  INTO Customer
    VALUES  ( 1, N'Stefan', N'dsfiuj23498ujk' ) ,
            ( 2, N'Volker', N'kldgfkdfjg2340' ) ;
    
    INSERT  INTO CreditCardNumber
    VALUES  ( 1, HASHBYTES('SHA1', N'1234 5678 9012 3456' + N'dsfiuj23498ujk') ) ,
            ( 1, HASHBYTES('SHA1', N'5678 9012 3456 1234' + N'dsfiuj23498ujk') ) ,
            ( 2, HASHBYTES('SHA1', N'9012 3456 1234 5678' + N'kldgfkdfjg2340') ) ;
    GO
    
    -- Search for an credit card number.
    DECLARE @CreditCardNumber NVARCHAR(255) = N'9012 3456 1234 5678' ;
    
    SELECT  C.* ,
            CCN.*
    FROM    Customer C
            INNER JOIN CreditCardNumber CCN ON C.ID = CCN.idCustomer
    WHERE   CCN.NumberHash = HASHBYTES('SHA1', @CreditCardNumber + C.CustomerSalt) ;
    GO
    
    DROP TABLE Customer ;
    DROP TABLE CreditCardNumber ;
    GO      

    Wobei jeder Kunde sein individuelles und *zufalliges* Salt braucht.


    Microsoft MVP Office Access
    https://mvp.support.microsoft.com/profile/Stefan.Hoffmann
    Mittwoch, 8. Juni 2011 13:15
  • Hallo Volker,

    wenn ich dich richtig verstanden habe, brauchst du doch nur einen Hashwert der Kreditkartennummer. Wozu die Verschlüsselung? Du errechnest den Hash der Kreditkartennummer und speicherst diesen ab.

    Viele Grüße
    Holger M. Rößler


    Kaum macht man es richtig, schon funktioniert es
    Mittwoch, 8. Juni 2011 13:18
  • Hallo Holger,

    Nur der Hashwert ist nicht ausreichend, da bei Kreditnummern ja bekannt ist, dass sie 16-stellig sind und nur Zahlen von 0-9 haben. Mit einer einfachen for-each-Schleife sind die Hashwerte für alle möglichen Kreditkarten-Nummern relativ einfach errechnet und in eine Tabelle geschrieben. Es ist dann eine einfache Abfrage um die Kartennummer im Klartext dem Kunden und damit auch dem Namen zuzuschreiben. In so einem Fall könnte ich es mir dan auch fast sparen die Kartendaten zu verschlüsseln.

    Die Idee von Stefan scheint mir aber richtig zu sein. Ich wollte den Salt in der Kreditkarten-Tabelle unterbringen; auf die Idee den zum Kunden zu packen war ich noch nicht gekommen.


    Volker
    Mittwoch, 8. Juni 2011 13:59
  • servus,

    Die Idee von Stefan scheint mir aber richtig zu sein. Ich wollte den Salt in der Kreditkarten-Tabelle unterbringen; auf die Idee den zum Kunden zu packen war ich noch nicht gekommen.

    Geht auch mit Salt bei den Fischen:

    USE Test ;
    GO
    
    CREATE TABLE Customer
        (
          ID INT NOT NULL ,
          CustomerName NVARCHAR(255) NOT NULL ,
          CustomerSalt NVARCHAR(255) NOT NULL ,
          CONSTRAINT PK_Customer PRIMARY KEY ( ID )
        ) ;
    
    CREATE TABLE CreditCardNumber
        (
          idCustomer INT NOT NULL ,
          NumberHash VARBINARY(128) NOT NULL ,
          NumberSalt NVARCHAR(255) NOT NULL ,
          CONSTRAINT UQ_CreditCardNumber UNIQUE ( NumberHash )
        ) ;
    GO
    
    INSERT  INTO Customer
    VALUES  ( 1, N'Stefan', N'dsfiuj23498ujk' ) ,
            ( 2, N'Volker', N'kldgfkdfjg2340' ) ;
    
    INSERT  INTO CreditCardNumber
    VALUES  ( 1, HASHBYTES('SHA1', N'1234 5678 9012 3456' + N'dsfiuj23498ujk' + N'retgrtejt3142'), N'retgrtejt3142' ) ,
            ( 1, HASHBYTES('SHA1', N'5678 9012 3456 1234' + N'dsfiuj23498ujk' + N'rrtzgfds98u232'), N'rrtzgfds98u232' ) ,
            ( 2, HASHBYTES('SHA1', N'9012 3456 1234 5678' + N'kldgfkdfjg2340' + N'fdgk4352314'), N'fdgk4352314' ) ;
    GO
    
    -- Search for an credit card number.
    DECLARE @CreditCardNumber NVARCHAR(255) = N'1234 5678 9012 3456' ;
    
    SELECT  C.* ,
            CCN.*
    FROM    Customer C
            INNER JOIN CreditCardNumber CCN ON C.ID = CCN.idCustomer
    WHERE   CCN.NumberHash = HASHBYTES('SHA1', @CreditCardNumber + C.CustomerSalt + CCN.NumberSalt) ;
    GO
    
    DROP TABLE Customer ;
    DROP TABLE CreditCardNumber ;
    GO

    Microsoft MVP Office Access
    https://mvp.support.microsoft.com/profile/Stefan.Hoffmann
    Mittwoch, 8. Juni 2011 14:57