2012-06-22 15 views
11

O ile rozumiem, klucze RSA są zwykle generowane na podstawie (silnego) losowego generatora.Generowanie pary kluczy RSA w javascript, w oparciu o hasło

Zamiast tego chcę je utworzyć na podstawie hasła.

Albo raczej na jego skrót, na przykład SHA512 (sha512 (hasło) + sól + pieprz + hasło)

musi to być zrobione po stronie klienta, w JavaScript.

Czy ktoś wie, jak to zrobić? Czy istnieje łatwa biblioteka JavaScript, która tworzy deterministycznie pary kluczy RSA na podstawie danych wejściowych?

(Faktycznie, ja wspomnieć RSA ale każdy bezpieczne szyfrowanie asymetryczne wystarczy, tylko trzeba publiczno-prywatne szyfrowania)


Ponadto: Muszę to dlatego buduję jakieś bezpieczne rozwiązanie komunikacyjne, to nie musi polegać na połączeniu, a nawet na serwerze, aby być bezpiecznym.

Szyfruję całą zawartość za pomocą AES za pomocą losowych kluczy, a klucze są szyfrowane za pomocą RSA. Chodzi o to, że Alicja może szyfrować swoją zawartość (lub klucz AES dla jej zawartości) za pomocą klucza publicznego Boba (dlatego klucz publiczny Boba musi być przechowywany online).

Później, kiedy Bob wchodzi ponownie swoje hasło, jego przeglądarka może deterministycznie obliczyć swój prywatny RSA & klucz publiczny na miejscu, należy pobrać zawartość z Alice i odszyfrować go lokalnie za pomocą swojego klucza prywatnego.

+0

Tworzenie kluczy RSA za pomocą JavaScript? Pamiętam, że sam go wypróbowałem. Pożarło mi całą pamięć i trwało wiecznie, aby obliczyć. Przestawiłem się na Javę. – Amberlamps

+0

Asymetryczny schemat szyfrowania inny niż RSA również byłby w porządku. Ale muszę wygenerować stronę klienta kluczy i zaszyfrować dane (kluczem prywatnym) przed wysłaniem. Klucz publiczny będzie przechowywany po stronie serwera.Nie wiem, czy podejścia ECC są szybsze? –

+1

@SheldonPinkman Szyfrowanie odbywa się za pomocą klucza publicznego, a nie prywatnego. Konsekwentnie twój pomysł jest wadliwy. –

Odpowiedz

2

Klucze RSA to nie tylko losowe bity, jak większość algorytmów symetrycznych, są to wykładniki i moduły pochodzące z dużych liczb pierwszych. Dlatego nie widzę żadnego rozsądnego sposobu wygenerowania ich z hasła. Zobacz this wikipedia article.

Do czego używasz tych par kluczy? Dlaczego muszą pochodzić z hasła? Jeśli chcesz użyć hasła do szyfrowania czegoś, możesz użyć SHA256 (hasło) do wyprowadzenia klucza AES256. (pamiętaj, aby przeczytać na key strengthening, jeśli masz zamiar to zrobić).

+0

możesz zainicjować randomizator za pomocą hasła i uzyskać klucz, który "zależy" od hasła w ten sposób. Ale zwykle nie ma praktycznego powodu, aby to zrobić (znam jeden przypadek, gdy jest to rozsądne). –

+1

Cóż, przypuszczam, że brak RNG byłby dobrym powodem. Ale mam wrażenie, że cały ten system ma poważne wady konstrukcyjne. –

+2

@Petey: Wiem, że klucze RSA nie są tylko bitami losowymi, ale mogę po prostu zastąpić generator losowy (gdziekolwiek występuje w istniejącym generatorze kluczy RSA) z czymś, co pochodzi od hasła. Może to być nawet generator losowy, który jest po prostu zaszczepiony hash hasła. W ten sposób to samo hasło spowoduje dokładnie ten sam klucz RSA. –

9

Wygląda na to, że Cryptico może ci pomóc, gdy będziesz podawać hasło jako materiał siewny dla RNG.

+0

Fantastyczny, wygląda idealnie! –

+0

Link nie działa. – Akam

+0

link @akam zaktualizowany, dziękuję. –

2

nie mogę wypowiedzieć się na temat mojego punctuationbut, ale oprócz tego, co powiedział + Eugene_Mayevski_'EldoS

dla czystego javascript: https://www.npmjs.com/package/cryptico

dla nodejs: https://www.npmjs.com/package/cryptico trzeba:

npm install cryptico 

I dodaj tę linię:

var cryptico = require("cryptico"); 

do tworzenia obiektów:

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

kiedy używam var cryptico = require ("cryptico"); w moim component.ts pojawia się błąd ----- "(SystemJS) Błąd XHR (404 Not Found) ładowanie http: // localhost: 5555/node_modules/crypto.js". – Khushi

Powiązane problemy