2011-12-15 69 views
21

Tôi phải tạo hai khóa (riêng tư và công khai) để mã hóa văn bản với công chúng và cho phép người dùng có khóa cá nhân giải mã văn bản.Làm cách nào để tạo một cặp khóa riêng/khóa công khai bằng cách sử dụng mật mã Node.js?

Có thể với mô-đun Crypto không?

Cảm ơn bạn!

+0

Tôi không chắc chắn cách bạn sẽ cung cấp cho người dùng khóa riêng tư của họ một cách an toàn. Tôi sẽ tốt hơn nếu họ tạo ra cặp chìa khóa của họ tại địa phương và cung cấp cho bạn khóa công khai của họ. – Bruno

+1

@Bruno vâng, không có vấn đề về nó ... mục tiêu của tôi là để hiểu làm thế nào để tạo ra một cặp chìa khóa (riêng tư, công khai) với Node.js, là điều này có thể? – Dail

Trả lời

5

Nếu bạn biết làm thế nào để có được những gì bạn muốn từ OpenSSL, tôi nghĩ rằng nó hoàn toàn hợp lý để chạy OpenSSL bằng cách sử dụng của Node child_process.

var cp = require('child_process') 
    , assert = require('assert') 
    ; 

var privateKey, publicKey; 
publicKey = ''; 
cp.exec('openssl genrsa 2048', function(err, stdout, stderr) { 
    assert.ok(!err); 
    privateKey = stdout; 
    console.log(privateKey); 
    makepub = cp.spawn('openssl', ['rsa', '-pubout']); 
    makepub.on('exit', function(code) { 
    assert.equal(code, 0); 
    console.log(publicKey); 
    }); 
    makepub.stdout.on('data', function(data) { 
    publicKey += data; 
    }); 
    makepub.stdout.setEncoding('ascii'); 
    makepub.stdin.write(privateKey); 
    makepub.stdin.end(); 
}); 
+3

Rất OS phụ thuộc vào ý kiến ​​của tôi. –

+0

Nó có thể không hoạt động trên BeOS – kgilpin

+5

chắc chắn sẽ không hoạt động trên amstrad không tồn tại của tôi. – airtonix

0

Bạn có thể sử dụng this rsa-json module. Nó chỉ sinh ra một quá trình openssl, do đó, nó là khá phụ thuộc vào hệ điều hành (nó không hoạt động theo mặc định trên cửa sổ).

1

tuyến con_process là một giải pháp khủng khiếp và không thể mở rộng được. Tránh xa.

Tôi đã chọn thay thế bằng số keypair.

Chúc mừng

+1

'cặp khóa 'chậm hơn nhiều so với OpenSSL và cũng đồng bộ trong khi tuyến OpenSSL không đồng bộ. Tuyến con_process là _more_ có thể mở rộng. –

12

Sử dụng mô-đun mật mã từ npm để tạo KeyPair.

var crypto = require('crypto'); 

var prime_length = 60; 
var diffHell = crypto.createDiffieHellman(prime_length); 

diffHell.generateKeys('base64'); 
console.log("Public Key : " ,diffHell.getPublicKey('base64')); 
console.log("Private Key : " ,diffHell.getPrivateKey('base64')); 

console.log("Public Key : " ,diffHell.getPublicKey('hex')); 
console.log("Private Key : " ,diffHell.getPrivateKey('hex')); 

Phía trên là một đoạn mã mẫu. Để biết thêm tài liệu thanh toán http://nodejs.org/api/crypto.html

+1

Câu trả lời này không bao gồm mã hóa và giải mã. – fadedbee

+8

Câu hỏi không yêu cầu mã hóa và giải mã. Nó chỉ yêu cầu tạo cặp khóa. Và mã hóa và giải mã được giải thích rất rõ trong tài liệu. – Aks

+4

Tôi thích điều này, nhưng làm thế nào để có được một cặp khóa được định dạng PEM với mật mã? –

14

Mã sau hoạt động, nhưng tôi không phải là chuyên gia mật mã chuyên nghiệp, vì vậy một số nhận xét ở đây sẽ hữu ích.

Tôi đã sử dụng mô-đun RSA ursa, thay vì mật mã.

Tôi lo ngại rằng nếu dữ liệu tương tự đã được mã hóa trực tiếp, không có thông qua AES hoặc tương tự, thì có thể sẽ không quan trọng để phá vỡ điều này. Bình luận xin vui lòng ...

var ursa = require('ursa'); 
var fs = require('fs'); 

// create a pair of keys (a private key contains both keys...) 
var keys = ursa.generatePrivateKey(); 
console.log('keys:', keys); 

// reconstitute the private key from a base64 encoding 
var privPem = keys.toPrivatePem('base64'); 
console.log('privPem:', privPem); 

var priv = ursa.createPrivateKey(privPem, '', 'base64'); 

// make a public key, to be used for encryption 
var pubPem = keys.toPublicPem('base64'); 
console.log('pubPem:', pubPem); 

var pub = ursa.createPublicKey(pubPem, 'base64'); 

// encrypt, with the public key, then decrypt with the private 
var data = new Buffer('hello world'); 
console.log('data:', data); 

var enc = pub.encrypt(data); 
console.log('enc:', enc); 

var unenc = priv.decrypt(enc); 
console.log('unenc:', unenc); 

Sau khi điều tra thêm http://en.wikipedia.org/w/index.php?title=RSA_%28cryptosystem%29&section=12#Attacks_against_plain_RSA có vẻ như ursa đã có đệm.

+3

Chris: Nhận xét của bạn trong đoạn mã cho biết mã hóa với riêng và giải mã với công chúng, nhưng mã ngược lại: mã hóa với công chúng và giải mã với riêng tư. Khi tôi cố gắng mã hóa với tư nhân, pub.decrypt (enc) cho tôi biết rằng chức năng giải mã trên pub là không xác định! Bất kỳ suy nghĩ nào. Thx – HarleyDave

+0

Thư viện ursa có vẻ hơi bị bỏ hoang. – Pablo

Các vấn đề liên quan