2012-06-22 11 views
11

Soweit ich verstehe, RSA-Schlüssel werden in der Regel basierend auf einem (starken) Zufallsgenerator generiert.Generieren RSA-Schlüsselpaar in Javascript, basierend auf einem Kennwort

Stattdessen möchte ich sie basierend auf einem Kennwort erstellen.

Oder vielmehr auf seinem Hash, zum Beispiel sha512 (sha512 (Passwort + Salz) + Passwort + Pfeffer)

Dieses Client-Seite getan werden muss, in JavaScript.

Würde jemand wissen, wie man das macht? Gibt es eine einfache JavaScript-Bibliothek, die RSA-Schlüsselpaare basierend auf einer gegebenen Eingabe deterministisch erstellt?

(Eigentlich ist mich zu erwähnen RSA aber jede sichere asymmetrische Verschlüsselung ausreichen würde, ich brauche nur öffentlich-private Verschlüsselung)


Zusatz: ich das brauche, weil ich eine sichere Kommunikationslösung baute, Das muss sich nicht auf die Verbindung oder sogar den Server verlassen, um sicher zu sein.

Ich verschlüssele alle Inhalte mit AES mit zufälligen Schlüsseln, und die Schlüssel sind RSA-verschlüsselt. Die Idee ist, dass Alice ihren Inhalt (oder eigentlich den AES-Schlüssel für ihren Inhalt) mit Bobs öffentlichem Schlüssel RSA-verschlüsseln kann (daher muss Bobs öffentlicher Schlüssel online gespeichert werden).

Später, wenn Bob sein Passwort erneut eingibt, kann sein Browser deterministisch seinen öffentlichen RSA-Schlüssel & an Ort und Stelle berechnen, den Inhalt von Alice herunterladen und ihn mit seinem privaten Schlüssel lokal entschlüsseln.

+0

Erstellen von RSA-Schlüsseln mit JavaScript? Ich erinnere mich daran, es selbst zu versuchen. Es hat meine ganze Erinnerung verschlungen und dauerte ewig um zu berechnen. Ich wechselte dann zu Java. – Amberlamps

+0

Ein anderes asymmetrisches Verschlüsselungsschema als RSA wäre ebenfalls in Ordnung. Aber ich muss die Schlüssel clientseitig erzeugen und Daten (mit privatem Schlüssel) vor dem Senden verschlüsseln. Der öffentliche Schlüssel wird serverseitig gespeichert.Ich weiß nicht, ob ECC-Ansätze schneller sind. –

+1

@SheldonPinkman Verschlüsselung erfolgt mit öffentlichen Schlüssel, nicht privat. Konsequent ist Ihre Idee fehlerhaft. –

Antwort

2

RSA-Schlüssel sind nicht nur zufällige Bits wie die meisten symmetrischen Algorithmen, sie sind Exponenten und Moduluses, die von großen Primzahlen abgeleitet sind. Daher sehe ich keine vernünftige Möglichkeit, sie aus einem Passwort zu generieren. Siehe this wikipedia article.

Wofür verwenden Sie diese Schlüsselpaare? Warum müssen sie von einem Passwort abgeleitet werden? Wenn Sie ein Passwort verwenden möchten, um etwas zu verschlüsseln, könnten Sie ein SHA256 (Passwort) verwenden, um einen AES256-Schlüssel abzuleiten. (Lesen Sie auf key strengthening, wenn Sie dies tun).

+0

Sie können den Randomizer mit dem Passwort initialisieren, und erhalten Sie den Schlüssel, der auf diese Weise auf das Passwort "hängt". Aber es gibt normalerweise keinen praktischen Grund, dies zu tun (ich kenne einen Fall, wenn es sinnvoll ist :). –

+1

Nun, ich denke, das Fehlen eines RNG wäre ein guter Grund. Aber ich habe das Gefühl, dass dieses ganze Schema einige ernsthafte Konstruktionsfehler hat. –

+2

@Petey: Ich weiß RSA-Schlüssel sind nicht nur zufällige Bits, aber ich könnte einfach den Zufallsgenerator (wo immer es in einem vorhandenen RSA-Schlüsselgenerator auftritt) durch etwas ersetzen, das vom Passwort abgeleitet ist. Es könnte sogar ein Zufallsgenerator sein, der einfach mit dem Hash des Passworts versehen wird. Auf diese Weise ergibt das gleiche Passwort genau den gleichen RSA-Schlüssel. –

9

Sieht aus wie Cryptico kann Ihnen helfen, wenn Sie Ihr Passwort als Samen für RNG füttern.

+0

Super, sieht perfekt aus! –

+0

der Link funktioniert nicht. – Akam

+0

@akam link aktualisiert, danke. –

2

Ich kann nicht auf meine punctuationbut kommentieren, aber zusätzlich zu dem, was er sagte, + Eugene_Mayevski_'EldoS

für Javascript rein: https://www.npmjs.com/package/cryptico

für NodeJS: https://www.npmjs.com/package/cryptico Sie brauchen:

npm install cryptico 

Und füge diese Zeile hinzu:

var cryptico = require("cryptico"); 

zum Erstellen von Objekten:

function cryptoObj(passPhrase) 
{ 
    this.bits = 1024; //2048; 
    this.passPhrase = passPhrase; 
    this.rsaKey = cryptico.generateRSAKey(this.passPhrase,this.bits); 
    this.rsaPublicKey = cryptico.publicKeyString(this.rsaKey); 

    this.encrypt = function(message){ 
    var result = cryptico.encrypt(message,this.rsaPublicKey); 
    return result.cipher; 
    }; 

    this.decrypt = function(message){ 
    var result = cryptico.decrypt(message, this.rsaKey); 
    return result.plaintext; 
    }; 
} 

console.log('---------------------------------------------------------'); 
var localEncryptor = new cryptoObj("XXyour secret txt or number hereXX"); 

var encryptedMessage = localEncryptor.encrypt('new message or json code here'); 
var decryptedMessage = localEncryptor.decrypt(encryptedMessage); 

console.log(''); 
console.log('>>> Encrypted Message: '+encryptedMessage); 
console.log(''); 
console.log('>>> Decrypted Message: '+decryptedMessage); 
+0

wenn ich var cryptico = require ("cryptico") verwende; in meinem component.ts habe ich einen Fehler ----- "(SystemJS) XHR Fehler (404 nicht gefunden) laden http: // localhost: 5555/node_modules/crypto.js". – Khushi