2017-01-18 1 views
0

Ich versuche, die Java-Bibliothek zu konvertieren - AESCrypt-Java zu Javascript.Konvertieren Java AES-Verschlüsselung in Javascript mit der Crypto-Bibliothek

Dies ist meine Implementierung bisher für die Entschlüsselungsfunktion. Ich kann den Text nicht entschlüsseln. Kann jemand herausfinden, wo ich falsch liege?

function decrypt(password, base64text) { 
    key = generateKey(password); 
    var decodedCipherText = new Buffer(base64text, 'base64') 
    var iv = new Buffer(16); 
    iv.fill(0); 
    var decipher = crypto.createDecipheriv("aes-256-cbc", key, iv) 
    let decrypted = decipher.update(decodedCipherText, 'base64', 'utf-8'); 
    decrypted += decipher.final('utf-8') 
    return decryptedBytes 
} 

function generateKey(password) { 
    return crypto.createHash('sha256').update(usr_id).digest(); 
} 

var encryptedText = '1+2yFMDH1C/uIc1huwezbrsQ=='; 
var password  = '8AVrWtyabQ'; 
decrypt(password, encryptedText) 

Die erwartete Klartextausgabe ist Wordpress.

+0

Ihr Link ist kaputt und es ist nicht klar, welche JS-Crypto-Bibliothek Sie verwenden. – pvg

+0

@pvg Entschuldigung. Ich habe den Link aktualisiert –

Antwort

1

Sie machen ein paar Entscheidungen, die die Sicherheit Ihrer sensiblen Werte negativ beeinflussen wird:

  1. Sie sind eine statische mit All-Null-IV. Die IV muss für jede mit einem bestimmten Schlüssel verschlüsselte Nachricht eindeutig und nicht vorhersehbar sein. Die IV kann dann dem verschlüsselten Text vorangestellt und ungeschützt an den Empfänger übertragen werden, wo sie geschnitten und zur Entschlüsselung verwendet wird.
  2. Ihre Schlüsselableitungsfunktion (KDF) ist schwach - SHA-256 kann bei 23 billion attempts per second on commodity hardware gecrackt werden. Verwenden Sie einen Key-Stretch-Algorithmus wie mit einer hohen Iterationszahl oder bcrypt oder scrypt für die Speicherhärte.
  3. Ihr Chiffretext ist nicht authentifiziert - AES/CBC bietet Vertraulichkeit, aber keine Integrität oder Authentifizierung. Ein Interzeptor kann den verschlüsselten Text bei der Übertragung manipulieren und versuchen, ihn zu entschlüsseln. Dies kann zu einer nicht autorisierten Entschlüsselung (d. H. Zum Einbringen von bösartigem Klartext in Ihre Anwendung) oder zu einem Padding-Orakel-Angriff und schließlich zur Chiffretext-Wiederherstellung führen. Verwenden Sie einen authentifizierten Verschlüsselungsmodus (mit zugeordneten Daten) (AE oder AEAD), um dies zu verringern, oder fügen Sie eine starke HMAC-Konstruktion mit einem separaten Schlüssel über dem Chiffretext hinzu und überprüfen Sie vor der Entschlüsselung mit einer Gleichzeitmethode.
  4. new Buffer(string, encoding) und new Buffer(size) sind veraltet und Buffer.from(string, encoding) und Buffer.alloc(size) sollte stattdessen verwendet werden. Sie erstellen einen Buffer, der den bereitgestellten Verschlüsselungstext enthält, der in Base64 codiert ist. Ich habe das Gefühl, dass ein Problem mit Ihrer Kodierung auftritt (Sie sehen keine Beispielausgabe für uns). Here is an example von Verschlüsseln und Entschlüsseln mit Buffer Objekte.

    function encrypt(buffer){ 
        var cipher = crypto.createCipher(algorithm,password) 
        var crypted = Buffer.concat([cipher.update(buffer),cipher.final()]); 
        return crypted; 
    } 
    
    function decrypt(buffer){ 
        var decipher = crypto.createDecipher(algorithm,password) 
        var dec = Buffer.concat([decipher.update(buffer) , decipher.final()]); 
        return dec; 
    } 
    
    var hw = encrypt(new Buffer("hello world", "utf8")) 
    // outputs hello world 
    console.log(decrypt(hw).toString('utf8')); 
    

    Wie Sie sehen können, cipher.update(buffer) nimmt die Codierung intern, so dass Sie nicht brauchen.

Verwandte Themen