crypto.generateKeyPairSync() 메서드는 지정한 유형의 새로운 비대칭 키 쌍(asymmetric key pair)을 동기(synchronous) 방식으로 생성하는 데 사용됩니다. 키 쌍 생성 시 지원되는 알고리즘 타입은 RSA, DSA, EC, Ed25519, Ed448, X25519, X448, DH입니다.
이 함수는 publicKeyEncoding 또는 privateKeyEncoding 옵션이 지정되면 결과에 대해 keyObject.export()가 호출된 것처럼 동작하며, 옵션이 없으면 해당하는 keyObject 객체가 그대로 반환됩니다. 공개 키(public key)에는 'spki', 개인 키(private key)에는 'pkcs8' 인코딩 형식이 권장됩니다.
문법(Syntax)
crypto.generateKeyPairSync(type, options)
매개변수(Parameters)
type – 키를 생성할 알고리즘 유형을 나타내는 문자열입니다. 지원되는 타입은 RSA, DSA, EC, Ed25519, Ed448, X25519, X448, DH입니다.
options – 아래와 같은 매개변수들을 포함할 수 있습니다.
modulusLength – RSA, DSA 타입에서 키 크기를 비트(bit) 단위로 지정합니다.
publicExponent – RSA 알고리즘의 공개 지수(exponent) 값을 지정합니다.
기본값:0x10001divisorLength – q의 크기를 비트 단위로 지정합니다.
namedCurve – 사용할 타원 곡선(elliptic curve)의 이름을 지정합니다.
prime – DH와 같은 타입에서 사용할 소수(prime) 매개변수를 지정합니다.
primeLength – 소수의 길이를 비트 단위로 지정합니다.
generator – 사용자 정의 제너레이터(generator) 값을 지정합니다. 기본값:
2groupName – DH 알고리즘에서 사용할 디피-헬만(Diffie-Hellman) 그룹 이름입니다.
publicKeyEncoding – 공개 키 인코딩 정보를 담는 문자열 값입니다.
privateKeyEncoding – 개인 키 인코딩 정보를 담는 문자열 값입니다.
예제 1: EC 타입 키 쌍 생성하기
먼저 generateKeyPairSync.js라는 이름의 파일을 만들고 아래 코드를 복사해 넣습니다. 이후 다음 명령어로 코드를 실행하면 됩니다.
node generateKeyPairSync.js
generateKeyPairSync.js
// Node.js program to demonstrate the flow of crypto.generateKeyPair() method
// Importing generateKeyPairSync from crypto module
const { generateKeyPairSync } = require('crypto');
// Getting the value of publicKey and privateKey in a sync process
const { publicKey, privateKey } = generateKeyPairSync('ec', {
namedCurve: 'secp256k1', // Implementing options
publicKeyEncoding: {
type: 'spki',
format: 'der'
},
privateKeyEncoding: {
type: 'pkcs8',
format: 'der'
}
});
// Printing the asymmetric key pair in a sync process
console.log("The public key is: ", publicKey);
console.log();
console.log("The private key is: ", privateKey);
실행 결과
C:\home\node>> node generateKeyPairSync.js The public key is: <Buffer 30 56 30 10 06 07 2a 86 48 ce 3d 02 01 06 05 2b 81 04 00 0a 03 42 00 04 a1 76 dd f0 fe 96 cc 28 59 a5 45 16 58 86 ca 3b 56 1e 04 ee b0 de 28 67 0a 70 ... > The private key is: <Buffer 30 81 84 02 01 00 30 10 06 07 2a 86 48 ce 3d 02 01 06 05 2b 81 04 00 0a 04 6d 30 6b 02 01 01 04 20 e6 f0 69 2e b0 35 7d 0b 5c ba 76 fc dc 9f 95 ae d7 ... >
위 예제에서는 'secp256k1' 곡선을 사용해 EC 타입의 키 쌍을 생성했습니다. 인코딩 옵션으로 DER 형식의 spki/pkcs8을 지정했기 때문에 결과가 Buffer 형태로 반환되는 것을 확인할 수 있습니다.
예제 2: DSA 타입 키 쌍 생성 및 base64 변환
이번에는 DSA 타입으로 키 쌍을 생성한 뒤, 결과를 base64 문자열로 변환하여 출력하는 예제를 살펴보겠습니다.
// Node.js program to demonstrate the flow of crypto.generateKeyPair() method
// Importing generateKeyPairSync from crypto module
const { generateKeyPairSync } = require('crypto');
// Getting the value of publicKey and privateKey in a sync process
const { publicKey, privateKey } = generateKeyPairSync('dsa', {
modulusLength: 570, // Implementing options
publicKeyEncoding: {
type: 'spki',
format: 'der'
},
privateKeyEncoding: {
type: 'pkcs8',
format: 'der'
}
});
// Printing asymmetric key pair after encoding
console.log("Public Key is: ", publicKey)
console.log("The public key value in base64 is: ",
publicKey.toString('base64'));
console.log("------------------------------------------------------")
console.log("Private Key is: ", privateKey)
console.log("The private key in base64 is: ",
privateKey.toString('base64'));
실행 결과
C:\home\node>> node generateKeyPairSync.js Public Key is: <Buffer 30 82 01 0f 30 81 bf 06 07 2a 86 48 ce 38 04 01 30 81 b3 02 49 00 9a 5c dd a3 ce 0e 8e 3e 0e ed 11 96 13 fe 1c a6 f6 35 27 0c 60 f9 51 ee dd 2c 75 12 ... > The public key value in base64 is: MIIBDzCBvwYHKoZIzjgEATCBswJJAJpc3aPODo4+Du0RlhP+HKb2NScMYPlR7t0sdRJhr0JWPvtRyF Wmn5ZAldFdDrUye5eQ+HmwgJboEWtCUm3b24CoLSQ74P1YkwIdAJs5rCSAIefaTT469xx+/8C3jS4W jYpHci0rft8CR3Fx1wxDFdCHJBqPlR7iGxd+7nZlChABL7UqCZMaiwCJ2ijVXc5dgr3Frudu7CbaAn RJStbqDjm5ppj4aaZV/9FmKvWVao9wA0sAAkhQtXOIWQrHde+fXoZLgPhbTBctPB1tcFztNmq2s3IO KGfo2kFUL6eJu811SSZ1scQFLVKc5DrZIdW7t3UqzEH+xCVxNkWtGQk= ------------------------------------------------------ Private Key is: <Buffer 30 81 e5 02 01 00 30 81 bf 06 07 2a 86 48 ce 38 04 01 30 81 b3 02 49 00 9a 5c dd a3 ce 0e 8e 3e 0e ed 11 96 13 fe 1c a6 f6 35 27 0c 60 f9 51 ee dd 2c ... > The private key in base64 is: MIHlAgEAMIG/BgcqhkjOOAQBMIGzAkkAmlzdo84Ojj4O7RGWE/4cpvY1Jwxg+VHu3Sx1EmGvQlY++1 HIVaaflkCV0V0OtTJ7l5D4ebCAlugRa0JSbdvbgKgtJDvg/ViTAh0AmzmsJIAh59pNPjr3HH7/wLeN LhaNikdyLSt+3wJHcXHXDEMV0IckGo+VHuIbF37udmUKEAEvtSoJkxqLAInaKNVdzl2CvcWu527sJt oCdElK1uoOObmmmPhpplX/0WYq9ZVqj3AEHgIcJ2ON17GGE4FrtkJak337GB+bAEkb+YjulN2rug==
참고: 동기 방식으로 키를 생성하면 작업이 완료될 때까지 이벤트 루프가 블로킹될 수 있습니다. 따라서 키 크기가 큰 경우나 서비스 환경에서는 비동기 버전인 crypto.generateKeyPair()를 사용하는 것이 좋습니다.