{ "source": "doc-ko/api/crypto.markdown", "modules": [ { "textRaw": "Crypto", "name": "crypto", "desc": "
Stability: 2 - Unstable; 차기 버전에서 API 변경을 논의 중이다.\n호환성을 깨뜨리는 정도의 변경은 최소화할 것이다. 하단을 참고해라.
\n이 모듈에 접근하려면 require('crypto')
를 사용해라.\n\n
crypto 모듈은 안정한 HTTPS net이나 http 연결에서 사용되는\n안정한 인증서를 캡슐화하는 방법을 제공한다.\n\n
\nOpenSSL의 hash, hmac, cipher, decipher, sign, verify 메서드의 랩퍼(wrapper)도\n제공한다.\n\n
\n메서드에 대한 래퍼(wrapper) 세트를 제공한다.\n\n\n
\n", "methods": [ { "textRaw": "crypto.getCiphers()", "type": "method", "name": "getCiphers", "desc": "지원하는 암호화 이름의 배열을 반환한다.\n\n
\n예제:\n\n
\nvar ciphers = crypto.getCiphers();\nconsole.log(ciphers); // ['AES128-SHA', 'AES256-SHA', ...]
\n",
"signatures": [
{
"params": []
}
]
},
{
"textRaw": "crypto.getHashes()",
"type": "method",
"name": "getHashes",
"desc": "지원하는 해시 알고리즘 이름의 배열을 반환한다.\n\n
\n예제:\n\n
\nvar hashes = crypto.getHashes();\nconsole.log(hashes); // ['sha', 'sha1', 'sha1WithRSAEncryption', ...]
\n",
"signatures": [
{
"params": []
}
]
},
{
"textRaw": "crypto.createCredentials(details)",
"type": "method",
"name": "createCredentials",
"desc": "인증서 객체를 생성한다. 선택사항인 details는 키를 가진 딕셔너리가 된다.\n\n
\npfx
: PFX나 PKCS12로 암호화된 개인키, 인증서, CA 증명서를 담고 있는 문자열이나 버퍼key
: PEM으로 암호화된 개인키를 담고 있는 문자열passphrase
: 개인키나 pfx에 대한 암호문(passphrase) 문자열cert
: PEM으로 암호화된 증명서를 담고 있는 문자열ca
: PEM으로 암호화된 믿을 수 있는 CA 증명서의 문자열이나 리스트crl
: PEM으로 암호화된 CRL(Certificate Revocation List)의 문자열 혹은 문자열의 리스트ciphers
: 사용하거나 제외할 암호(cipher)를 설명하는 문자열. 자세한 형식은\nhttp://www.openssl.org/docs/apps/ciphers.html#CIPHER_LIST_FORMAT를 참조해라.'ca'에 대한 세부내용을 전달하지 않는다면 node.js는 공개적으로 신뢰할 수 있는 CA의 리스트를 기본으로\n
\nhttp://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt에서\n받아서 사용할 것이다.\n\n\n
\n", "signatures": [ { "params": [ { "name": "details" } ] } ] }, { "textRaw": "crypto.createHash(algorithm)", "type": "method", "name": "createHash", "desc": "해시 객체를 생성하고 반환한다. 전달한 algorithm의 암호화 해시는 해시 다이제스트를\n생성하는 데 사용할 수 있다.\n\n
\nalgorithm
은 플랫폼상의 OpenSSL 버전에서 사용할 수 있는 알고리즘에 의존한다.\n'sha1'
, 'md5'
, 'sha256'
, 'sha512'
등이 있다. 최근 릴리즈에서는\nopenssl list-message-digest-algorithms
로 사용할 수 있는 다이제스트 알로리즘을 볼 수 있다.\n\n
예제: 이 프로그램은 파일의 sha1 합을 생성한다.\n\n
\nvar filename = process.argv[2];\nvar crypto = require('crypto');\nvar fs = require('fs');\n\nvar shasum = crypto.createHash('sha1');\n\nvar s = fs.ReadStream(filename);\ns.on('data', function(d) {\n shasum.update(d);\n});\n\ns.on('end', function() {\n var d = shasum.digest('hex');\n console.log(d + ' ' + filename);\n});
\n",
"signatures": [
{
"params": [
{
"name": "algorithm"
}
]
}
]
},
{
"textRaw": "crypto.createHmac(algorithm, key)",
"type": "method",
"name": "createHmac",
"desc": "hmac 객체를 생성하고 반환한다. 전달한 algorithm과 key의 암호화 해시이다.\n\n
\n이는 읽고 쓸 수 있는 stream이다. hmac을 계산하는데 쓰여진 데이터를 사용한다.\n스트림의 쓰기 가능한 쪽이 종료되고 나면 계산한 다이제스트를 얻는데 read()
메서드를 사용해라.\n레거시 update
와 digest
메서드도 지원한다.\n\n
algorithm
는 OpenSSL에서 사용할 수 있는 알고리즘에 의존한다. -- 위의 createHash를 봐라.\nkey
는 사용할 hmac 키이다.\n\n
전달한 algorithm과 password로 암호화한 암호화 객체를 생성하고 반환한다.\n\n
\nalgorithm
는 OpenSSL에 의존적이다. 'aes192'
등이 있다.\nOpenSSL 최근 릴리즈에서는 openssl list-cipher-algorithms
로 사용할 수 있는\n암호화 알고리즘을 볼 수 있다.\npassword
는 key와 IV를 얻는데 사용하고 반드시 'binary'
로 인코딩된 문자열이나\nbuffer이어야 한다.\n\n
이는 읽고 쓸 수 있는 stream이다. 해시를 계산하는데 작성된 데이터를 사용한다.\n스트림의 쓰기 가능한 쪽이 종료되면 계산된 해시 다이제스트를 얻을 때 read()
메서드를 사용해라.\n레거시 update
와 digest
메서드도 지원한다.\n\n
전달한 algorithm, key, iv로 암호화된 암호화 객체를 생성하고 반환한다.\n\n
\nalgorithm
은 createCipher()의
algorithm와 같다.
key는 algorithm에서 사용하는 로우 키(raw key)\n이다.
iv`는 초기화\n벡터(Initialization vector)이다.\n\n
key
와 iv
는 반드시 'binary'
로 인코딩된\n문자열이나 buffers여야 한다.\n\n
전달한 algorithm와 key로 decipher 객체를 생성하고 반환한다.\n이 함수는 위의 [createCipher()][]의 반영이다.\n\n
\n", "signatures": [ { "params": [ { "name": "algorithm" }, { "name": "password" } ] } ] }, { "textRaw": "crypto.createDecipheriv(algorithm, key, iv)", "type": "method", "name": "createDecipheriv", "desc": "전달한 algorithm, key, iv로 decipher 객체를 생성하고 반환한다.\n이 함수는 위의 [createCipheriv()][]의 반영이다.\n\n
\n", "signatures": [ { "params": [ { "name": "algorithm" }, { "name": "key" }, { "name": "iv" } ] } ] }, { "textRaw": "crypto.createSign(algorithm)", "type": "method", "name": "createSign", "desc": "전달한 algorithm으로 서명된 객체를 생성하고 반환한다.\n최근 OpenSSL 릴리즈에서 openssl list-public-key-algorithms
로 사용할 수 있는\n서명된 알고리즘을 볼 수 있다. 예를 들면 'RSA-SHA256'
가 있다.\n\n
전달한 algorithm으로 검증 객체를 생성하고 반환한다.\n이 함수는 위의 서명객체의 반영이다.\n\n
\n", "signatures": [ { "params": [ { "name": "algorithm" } ] } ] }, { "textRaw": "crypto.createDiffieHellman(prime_length)", "type": "method", "name": "createDiffieHellman", "desc": "Diffie-Hellman 키 교환 객체를 생성하고 전달한 비트 길이의 소수를 생성한다.\n사용된 제너레이터는 2
이다.\n\n
제공된 소수를 사용해서 Diffie-Hellman 키 교환 객체를 생성한다. 사용된 제너레이터는\n2
이다. 인코딩은 'binary'
, 'hex'
, 'base64'
가 될 수 있다.\n인코딩을 지정하지 않으면 버퍼라고 가정한다.\n\n
미리 정의된 Diffie-Hellman 키 교환 객체를 생성한다.\n지원하는 그룹은 'modp1'
, 'modp2'
, 'modp5'
\n([RFC 2412][]에 정의되어 있다.)\n와 'modp14'
, 'modp15'
, 'modp16'
, 'modp17'
, 'modp18'
\n([RFC 3526][]에 정의되어 있다.)이다.\n반환된 객체는 위의 [crypto.createDiffieHellman()][]가 생성한 객체의\n인터페이스와 비슷하지만 키를 변경할 수 없다.(예를 들면\n[diffieHellman.setPublicKey()][]를 사용해서)\n이 루틴을 사용했을 때의 이점은 관련자들이 미리 그룹 규칙을 생성하지 않고\n교환하지도 않아서 프로세서와 통신 시간을 모두 아낄 수 있다.\n\n
공유된 비밀키를 얻는 예제:\n\n
\nvar crypto = require('crypto');\nvar alice = crypto.getDiffieHellman('modp5');\nvar bob = crypto.getDiffieHellman('modp5');\n\nalice.generateKeys();\nbob.generateKeys();\n\nvar alice_secret = alice.computeSecret(bob.getPublicKey(), null, 'hex');\nvar bob_secret = bob.computeSecret(alice.getPublicKey(), null, 'hex');\n\n/* alice_secret와 bob_secret는 같아야 한다. */\nconsole.log(alice_secret == bob_secret);
\n",
"signatures": [
{
"params": [
{
"name": "group_name"
}
]
}
]
},
{
"textRaw": "crypto.pbkdf2(password, salt, iterations, keylen, callback)",
"type": "method",
"name": "pbkdf2",
"desc": "비동기적인 PBKDF2가 전달한 password, salt, iterations에서 전달한 길이의 키를 얻기 위해\n의사난수의(pseudorandom) 함수 HMAC-SHA1를 적용한다.\ncallback은 2개의 아규먼트 (err, derivedKey)
를 받는다.\n\n
동기 PBKDF2 함수. derivedKey를 반환하거나 오류를 던진다.\n\n
\n", "signatures": [ { "params": [ { "name": "password" }, { "name": "salt" }, { "name": "iterations" }, { "name": "keylen" } ] } ] }, { "textRaw": "crypto.randomBytes(size, [callback])", "type": "method", "name": "randomBytes", "desc": "강력한 암호의 의사난수(pseudo-random) 데이터를 생성한다. 사용법:\n\n
\n// async\ncrypto.randomBytes(256, function(ex, buf) {\n if (ex) throw ex;\n console.log('Have %d bytes of random data: %s', buf.length, buf);\n});\n\n// sync\ntry {\n var buf = crypto.randomBytes(256);\n console.log('Have %d bytes of random data: %s', buf.length, buf);\n} catch (ex) {\n // handle error\n}
\n",
"signatures": [
{
"params": [
{
"name": "size"
},
{
"name": "callback",
"optional": true
}
]
}
]
},
{
"textRaw": "crypto.pseudoRandomBytes(size, [callback])",
"type": "method",
"name": "pseudoRandomBytes",
"desc": "암호가 아닌 강력한 임의의 의사 데이터(pseudo-random data)를 생성한다.\n데이터가 충분히 길다면 반환된 데이터는 유일한 값이 될 것이지만 반드시 예측할 수 없는 것은\n아니다. 이 때문에 이 함수의 출력은 암호화된 키의 생성처럼 예측불가능성이 중요한 곳에서는\n사용하지 말아야 한다.\n\n
\n반면 사용방법은 crypto.randomBytes
의 반대이다.\n\n
데이터의 해시 다이제스트를 생성하는 클래스다.\n\n
\n읽고 쓸 수 있는 stream이다. 해시를 계산하는데 작성된 데이터를 사용한다.\n스트림의 작성가능한 쪽이 종료되고 나면 계산된 해시 다이제스트를 얻는데 read()
메서드를\n사용해라. 레거시 update
와 digest
메서드도 지원한다.\n\n
crypto.createHash
가 반환하는 클래스다.\n\n
전달한 input_encoding
의 data
로 해시 내용을 갱신한다.\n전달한 input_encoding
인코딩은 'utf8'
, 'ascii'
, 'binary'
가 될 수 있다.\n인코딩을 지정하지 않으면 버퍼라고 가정한다.\n\n
이 함수는 스트림처럼 새로운 데이터가 올 때마다 여러 번 호출될 수 있다.\n\n
\n", "signatures": [ { "params": [ { "name": "data" }, { "name": "input_encoding", "optional": true } ] } ] }, { "textRaw": "hash.digest([encoding])", "type": "method", "name": "digest", "desc": "해시되어야 하는 전달한 데이터의 모든 다이제스트를 계산한다.\nencoding
은 'hex'
, 'binary'
, 'base64'
가 될 수 있다.\n인코딩을 지정하지 않으면 버퍼를 반환한다.\n\n
Note: hash
객체는 digest()
메서드가 호출한 후에는 사용할 수 없다.\n\n\n
암호화 hmac 내용을 생성하는 클래스다.\n\n
\ncrypto.createHmac
가 리턴하는 클래스다.\n\n
전달한 data
로 hmac 내용을 갱신한다.\n이 함수는 스트림처럼 새로운 데이터가 올 때마다 여러번 호출될 수 있다.\n\n
hmac이 되어야 하는 전달한 데이터의 모든 다이제스트를 계산한다.\nencoding
은 'hex'
, 'binary'
, 'base64'
가 될 수 있다.\n인코딩을 지정하지 않으면 버퍼를 반환한다.\n\n
Note: hmac
객체는 digest()
메서드가 호출한 후에는 사용할 수 없다.\n\n\n
데이터를 암호화하는 클래스이다.\n\n
\ncrypto.createCipher
와 crypto.createCipheriv
가 반환하는 객체다.\n\n
Cipher 객체는 읽고 쓸 수 있는 streams이다. 읽기 가능한 쪽에서\n암호화된 데이터를 생성할 때 작성한 평범한 텍스트 데이터를 사용한다. 레거시 update
와\nfinal
메서드도 지원한다.\n\n
전달한 input_encoding
의 인코딩의 data
로 cipher를 갱신한다.\ninput_encoding
는 'utf8'
, 'ascii'
, 'binary'
가 될 수 있다.\n인코딩을 지정하지 않으면 버퍼라고 가정한다.\n\n
output_encoding
는 암호화된 데이터의 출력형식을 지정하고 'binary'
, 'base64'
,\n'hex'
가 될 수 있다. 기본값은 'binary'
이다.\n\n
암호화된 내용을 반환하고 스트림처럼 새로운 데이터로 여러번 호출할 수 있다.\n\n
\n", "signatures": [ { "params": [ { "name": "data" }, { "name": "input_encoding", "optional": true }, { "name": "output_encoding", "optional": true } ] } ] }, { "textRaw": "cipher.final([output_encoding])", "type": "method", "name": "final", "desc": "'binary'
, 'base64'
, 'hex'
중의 하나인 output_encoding
로 남아있는 모든\n암호화된 내용을 반환한다. 인코딩을 지정하지 않으면 버퍼를 반환한다.\n\n
Note: cipher
객체는 final()
메서드를 호출한 후에는 사용할 수 없다.\n\n
입력데이터의 자동 패딩을 사용하지 않고 블럭 크기를 사용한다. auto_padding
가 false이면 전체 입력데이터의 길이는 cipher의 블럭 크기의 배수가 되어야 하고 그렇지 않으면 final
는 실패할 것이다.\n표준이 아닌 패딩은 유용한데 예를 들어 PKCS 패딩 대신 0x0
를 사용할 수 있다. 이 함수는 반드시 cipher.final
이전에 호출해야 한다.\n\n\n
데이터를 복호화하는 클래스다.\n\n
\ncrypto.createDecipher
와 crypto.createDecipheriv
가 반환하는 클래스다.\n\n
Decipher 객체는 읽고 쓸 수 있는 streams이다. 읽기 가능한 쪽에서\n평범한 텍스트 데이터를 생성할 때 작성한 암호화된 데이터를 사용한다. 레거시 update
와\nfinal
메서드도 지원한다.\n\n
'binary',
'base64',
'hex'로 인코딩된
data`로 decipher를 갱신한다.\n인코딩을 지정하지 않으면 버퍼라고 가정한다.\n\n
output_decoding
는 반환할 복호화된 평문의 형식을 지정한다. 'binary'
, 'ascii'
,\n'utf8'
가 될 수 있고 버퍼를 지정하지 않으면 버퍼를 반환한다.\n\n
'binary'
, 'ascii'
, 'utf8'
중에 하나가 될 수 있는 output_encoding
로 남아있는\n모든 복호화된 평문을 반환한다. 인코딩을 지정하지 않으면 버퍼를 반환한다.\n\n
Note: decipher
객체는 final()
메서드가 호출된 후에는 사용할 수 없다.\n\n
표준 블럭 패팅없이 암호화된 데이터를 decipher.final
가 확인하고 제거하지 않도록 자동 패딩을 사용하지 않을 수 있다. 입력데이터의 길이가 cipher 블락 크기의 배수일 때만 동작한다.\n이 함수는 반드시 데이터를 decipher.update
로 스트리밍하기 전에 호출해야 한다.\n\n\n
서명을 생성하는 클래스다.\n\n
\ncrypto.createSign
가 반환하는 클래스이다.\n\n
Sign 객체는 쓸 수 있는 streams이다. 사그니처를 생성할 때 작성한 데이터를\n사용한다. 모든 데이터를 쓰고 나면 sign
메서드가 시그니처를 반환할 것이다.\n레거시 update
메서드도 지원한다.\n\n
data로 sign 객체를 갱신한다.\n이 함수는 스트림처럼 새로운 데이터가 올 때마다 여러 번 호출할 수 있다.\n\n
\n", "signatures": [ { "params": [ { "name": "data" } ] } ] }, { "textRaw": "sign.sign(private_key, [output_format])", "type": "method", "name": "sign", "desc": "전달한 갱신 데이터 모두를 sign을 통해서 서명을 계산한다.\nprivate_key
는 서명에 사용할 PEM 인코딩된 개인키를 담고 있는 문자열이다.\n\n
'binary'
, 'hex'
, 'base64'
가 될 수 있는 output_format
의 서명을 반환한다.\n인코딩을 지정하지 않으면 버퍼를 반환한다.\n\n
Note: sign
객체는 sign()
메서드를 호출한 후에는 사용할 수 없다.\n\n
서명을 검증하는 클래스다.\n\n
\ncrypto.createVerify
가 반환하는 클래스이다.\n\n
Verify 객체는 쓰기 가능한 streams이다. 제공된 시그니처로 유효성 검사를\n할 때 작성한 데이터를 사용한다. 모든 데이터를 쓰고 나서 제공된 시그니처가 유효한 경우\nverify
메서드가 true를 반환할 것이다. 레거시 update
메서드도 지원한다.\n\n
data로 verifier 객체를 갱신한다.\n이 함수는 스트림처럼 새로운 데이터가 올 때마다 여러 번 호출할 수 있다.\n\n
\n", "signatures": [ { "params": [ { "name": "data" } ] } ] }, { "textRaw": "verifier.verify(object, signature, [signature_format])", "type": "method", "name": "verify", "desc": "object
와 signature
를 사용해서 서명된 데이터를 검증한다. object
는 RSA 공개키,\nDSA 공개키, X.509 인증서 중 하나가 될 수 있는 PEM으로 인코딩된 객체를 담고 있는 문자열이다.\nsignature
는 'binary'
, 'hex'
, 'base64'
가 될 수 있는 signature_format
의\n데이터에 대해 이전에 계산한 서명이다.\n인코딩을 지정하지 않으면 버퍼라고 가정한다.\n\n
데이터와 공개키에 대한 서명의 유효성에 따라 true나 false를 반환한다.\n\n
\nNote: verifier
객체는 verify()
메서드를 호출한 뒤에는 사용할 수 없다.\n\n
Diffie-Hellman 키 교환을 생성하는 클래스이다.\n\n
\ncrypto.createDiffieHellman
가 반환하는 클래스이다.\n\n
개인 Diffie-Hellman 키값과 공개 Diffie-Hellman 키값을 생성하고 지정한 인코딩으로\n공개키를 반환한다. 이 키는 다른 관련자에게 이동할 수 있다. 인코딩은 'binary'
,\n'hex'
, 'base64'
가 될 수 있다.\n인코딩을 지정하지 않으면 버퍼를 반환한다.\n\n
다른 관련자의 공개키로 other_public_key
를 사용하는 공유 시크릿을 계산하고 계산된\n공유 시크릿을 반환한다. 제공된 키는 지정한 input_encoding
를 사용해서 해석된다. 시크릿은\n지정한 output_encoding
을 사용하서 인코딩된다. 인코딩은 'binary'
, 'hex'
,\n'base64'
가 될 수 있고 입력 인코딩을 지정하지 않으면 버퍼로 간주한다.\n\n
출력인코딩을 지정하지 않으면 버퍼를 반환한다.\n\n
\n", "signatures": [ { "params": [ { "name": "other_public_key" }, { "name": "input_encoding", "optional": true }, { "name": "output_encoding", "optional": true } ] } ] }, { "textRaw": "diffieHellman.getPrime([encoding])", "type": "method", "name": "getPrime", "desc": "'binary'
, 'hex'
, 'base64'
가 될 수 있는 지정한 인코딩의 Diffie-Hellman 소수를\n반환한다. 인코딩을 지정하지 않으면 버퍼를 반환한다.\n\n
'binary'
, 'hex'
, 'base64'
가 될 수 있는 지정한 인코딩의 Diffie-Hellman 제너레이터를\n반환한다. 인코딩을 지정하지 않으면 버퍼를 반환한다.\n\n
'binary'
, 'hex'
, 'base64'
가 될 수 있는 지정한 인코딩의 Diffie-Hellman 공개키를\n반환한다. 인코딩을 지정하지 않으면 버퍼를 반환한다.\n\n
'binary'
, 'hex'
, 'base64'
가 될 수 있는 지정한 인코딩의 Diffie-Hellman 개인키를\n반환한다. 인코딩을 지정하지 않으면 버퍼를 반환한다.\n\n
Diffie-Hellman 공개키를 설정한다. 키 인코딩은 'binary'
, 'hex'
, 'base64'
가\n될 수 있다. 인코딩을 지정하지 않으면 버퍼로 간주한다.\n\n
Diffie-Hellman 개인키를 설정한다. 키 인코딩은 'binary'
, 'hex'
, 'base64'
가\n될 수 있다. 인코딩을 지정하지 않으면 버퍼로 간주한다.\n\n
문자열이나 버퍼를 받을 수 있는 함수에 사용하는 기본 인코딩. 기본값은 Buffer 객체를 사용하는\n'buffer'
이다. crypto 모듈을 기본 인코딩으로 'binary'
를 사용하는 레거시 프로그램과\n쉽게 호환성을 맞출 수 있다.\n\n
새로운 프로그램은 버퍼를 기대할 것이므로 임시적으로만 이 값을 사용해라.\n\n
\n" } ], "modules": [ { "textRaw": "Recent API Changes", "name": "recent_api_changes", "desc": "Crypto 모듈은 통일된 Stream API의 개념과 바이너리 데이터를 다루는 Buffer 객체가\n존재하기 전에 Node에 추가되었다.\n\n
\n그래서 다른 Node 클래스들에는 있는 일반적인 메서드가 스트리밍 클래스에는 없고 많은 메서드들이\nBuffers 대신 기본적으로 바이너리로 인코딩된 문자열을 받아들이고 반환한다.\n이는 기본적으로 Buffer를 대신 사용하도록 바뀌었다.\n\n
\n이 변경사항은 전부는 아니지만 일부에서는 호환성을 깨뜨릴 것이다.\n\n
\n예를 들어 현재 Sign 클래스에 기본 인자를 사용하고 그 결과를 Verify 클래스에 전달하고\n데이터를 검사하지 않는다면 이전과 마차가지로 계속 동작할 것이다.\n바이너리 문자열을 얻고 Verify 객체에 바이너리 문자열을 제공하는 곳에서\nBuffer를 얻을 것이고 Verify 객체에 Buffer를 제공할 것이다.\n\n
\n하지만 Buffers에서 제대로 동작하지 않을 문자열 데이터로 어떤 작업을 한거나(문자열을\n이어붙힌다거나 데이터베이스에 저장하는 등) 인코딩 인자없이 암호화함수에 바이너리 문자열을\n전달한다면 사용하고자 하는 인코딩을 지정하는 인코딩 인자를 제공해야 할 것이다.\n기본적으로 바이너리 문자열을 사용하는 이전 방식으로 변경하려면\ncrypto.DEFAULT_ENCODING
필드를 'binary'로 설정해라.\n새로운 프로그램은 버퍼를 기대할 것이므로 이는 임시적으로만 사용해라.\n\n\n