자세한 내용은 Nodejs 내장 암호화 모듈을 사용하여 피어 암호화 및 복호화 구현

암호화와 복호화는 통신 안전을 확보하는 중요한 수단이다. 현재 암호화 알고리즘은 이미 매우 많고 성숙한 소프트웨어 패키지를 사용할 수 있기 때문에 응용 개발 프로그래머의 부담을 크게 낮출 수 있다. 이런 제3자가 제공한 암호화 복호화 라이브러리만 사용하면 사용할 수 있다.js에서 사실은 매우 강력하고 편리한 암호화와 복호화 모듈crypto를 제공했다. 우리는 제3자의 NPM 라이브러리를 사용하지 않아도 간단한 암호화와 복호화 기능을 실현할 수 있다. 암호화와 복호화의 목적은 통신의 안전을 확보하기 위해서이다. 비관적인 제3자 라이브러리를 사용하면 항상 추가된 뒷문이나 어떤 것이 존재할 수 있기 때문에 Node를 사용한다.js 자체의crypto 모듈은 암호화의 안전성을 최대한 보장할 수 있습니다.

해시 값 계산crypto.Hash


해시 값 계산은 일반적으로 데이터의 완전성과 정확성을 검증하는 목적으로 사용된다. 우리가 받아들여야 할 데이터가 발송된 데이터와 똑같을 때 전송된 데이터의 해시 값과 수신된 데이터의 해시 값을 각각 계산할 수 있다.간단한 비교를 하면 두 개의 같은 데이터가 얻은 해시 값은 틀림없이 같다고 판단할 수 있다.해시 값은 역계산으로 원래의 데이터로 복원할 수 없기 때문에 데이터를 검증하는 데만 사용할 수 있다.그럼 노드에서.js에서는 어떻게 사용해야 합니까?
예제 코드

const crypto = require('crypto');
const hash = crypto.createHash('sha256');

hash.update('some data to hash');
console.log(hash.digest('hex'));
// Prints:
//   6a2da20943931e9834fc12cfe5bb47bbd9ae43489a30726962b576f4e3993e50

위의 코드는 Node에서 베낀 것이다.js 공식 프레젠테이션 코드, 나는 그 중에서 가장 간단한 사용 방식을 선택했다. 이런 사용 방식도 우리가 가장 자주 사용하는 것이다. 그것은 문자열이나 한 그룹의 데이터에 대해 해시 값을 계산하는 것이다.crypto.Hash가 구현한 해시 알고리즘은 고정된 비어인 시크릿을 계산의 산자로 사용한 것이다. 노드.js에는 그와 유사한 것이 하나 더 있지만 비밀의 비밀을 바꿀 수 있는 암호화 클래스crypto가 있습니다.Hmac.

가변 해시 계산crypto.Hmac


예제 코드

const crypto = require('crypto');
const hmac = crypto.createHmac('sha256', 'a secret');

hmac.update('some data to hash');
console.log(hmac.digest('hex'));
// Prints:
//   7fd04df92f636fd450bc841c9418e5825c17f33ad9c87c518115a45971f7f77e

crypto.Hmac의 사용 방법과crypto.Hash는 매우 비슷하다. 유일한 차이점은 사용자 정의할 수 있는 비어 시크릿이 하나 더 생겼다는 것이다. 맞춤형 비어 시크릿을 사용하는 용도는 비밀번호를 저장할 때 안전성을 높일 수 있다는 것이다. 기본 비어 시크릿의 해시 알고리즘 함수를 사용하면 어떤 알고리즘을 사용했는지 알면 폭력적인 충돌을 통해 비밀번호를 얻을 수 있지만 맞춤형 비어 시크릿의 해시 함수를 사용한다.빈거법을 써도 거의 풀 수가 없어요.

대칭 암호화 및 복호화


대칭 암호화와 복호화는 암호화와 복호화 쌍방이 같은 비어인 시크릿을 사용하여 복호화 알고리즘 연산을 실현하는 것을 의미한다. 이런 암호화 알고리즘은 공공 키와 개인 키를 필요로 하지 않고 사용하기가 비교적 편리하며 해시 알고리즘과 달리 대칭 암호화 복호화는 양방향으로 역연산할 수 있다.
Node.js에서는 많은 대칭 암호화 알고리즘을 지원하지만, 도대체 어떤 암호화 알고리즘이 당신의 컴퓨터에 설치된 OpenSSL에 의해 결정되는지, Node.js는 OpenSSL을 호출하러 갔을 뿐입니다.이것은 우리에게 번거로움을 가져다 준다. 그것은 문서에서 암호화 알고리즘 정보를 찾을 방법이 없다는 것이다. 그러면 번거로움이 어디에 있는지 알게 될 것이다.

대칭 암호화 사용 과정


암호화 예시 코드

 const crypto = require('crypto');

 const algorithm = 'aes-192-cbc';
 const password = 'Password used to generate key';
// Use the async `crypto.scrypt()` instead.
 const key = crypto.scryptSync(password, 'salt', 24);
// Use `crypto.randomBytes` to generate a random iv instead of the static iv
// shown here.
 const iv = Buffer.alloc(16, 0); // Initialization vector.

 const cipher = crypto.createCipheriv(algorithm, key, iv);

 let encrypted = cipher.update('some clear text data', 'utf8', 'hex');
 encrypted += cipher.final('hex');
 console.log(encrypted);
// Prints: e5f79c5915c02171eec6b212d5520d44480993d7d622a7c4c2da32f6efda0ffa

이 코드를 차근차근 설명해 봅시다.

const algorithm = 'aes-192-cbc';
이 줄은 정의에 사용되는 암호화 알고리즘으로 보통 3개 부분으로 구성되어 있으며 중간용-연결, 첫 번째 부분은 암호화 알고리즘 이름 aes, 두 번째 부분은 암호화 길이 192위, 세 번째 부분은 암호화 인증 방법(이 부분은 잘못 이해될 수 있음) cbc

 const key = crypto.scryptSync(password, 'salt', 24);

이 줄은 키 키 생성입니다. 마지막 숫자 24를 주의하십시오. 이것은 키 키 생성의 길이입니다. 최소 8, 최대 제한은 없지만 8의 배수여야 합니다. 키 키의 길이는 사용하는 암호화 알고리즘과 관련이 있습니다. 문서에 이 부분의 정보가 없기 때문에 사용할 때 끊임없이 시도할 수밖에 없습니다. 그렇지 않으면 오류가 발생합니다!

 const iv = Buffer.alloc(16, 0); // Initialization vector.
 const cipher = crypto.createCipheriv(algorithm, key, iv);

여섯 번째 줄은 초기 벡터 Initialization vector를 만드는 것입니다. 이것도 매우 관건적이지만 문서에 설명된 부분이 없습니다. IV의 길이도 매우 관건적입니다. 현재는 길이가 8의 배수여야 한다는 것만 알고 길이는 사용하는 알고리즘의 비트와 관련이 있지만 문서에 명확한 설명이 없기 때문에 사용할 때도 끊임없이 시도할 수밖에 없습니다.
키 키와 초기 벡터 Initialization vector 두 관건적인 매개 변수의 길이는 Node에 없습니다.js 문서에 명확하게 쓰여진 것은 매우 유감스럽습니다. 우리가 사용할 때 암호화 알고리즘 관련 자료를 찾거나 수동으로 시도할 수밖에 없어서 매우 불편합니다.

 let encrypted = cipher.update('some clear text data', 'utf8', 'hex');
 encrypted += cipher.final('hex');

이 두 줄은 매우 간단하다. 바로 입력한 문자열을 암호화하여 계산하는 것이다. 업데이트 (...,'utf8','hex') 중utf8은 암호화 전 문자열의 인코딩 형식이고,hex는 암호화 후 출력된 인코딩 형식이다.마지막으로 암호화된 문자열 뒤에 종료 문자를 추가해야 합니다. 이 작업은final ('hex') 에서 이루어지고,hex도 출력된 문자 인코딩 형식입니다.

대칭 복호화 과정


예제 코드 복호화

const crypto = require('crypto');

const algorithm = 'aes-192-cbc';
const password = 'Password used to generate key';
// Use the async `crypto.scrypt()` instead.
const key = crypto.scryptSync(password, 'salt', 24);
// The IV is usually passed along with the ciphertext.
const iv = Buffer.alloc(16, 0); // Initialization vector.

const decipher = crypto.createDecipheriv(algorithm, key, iv);

//  
//  
//  

// Encrypted using same algorithm, key and iv.
const encrypted =
  'e5f79c5915c02171eec6b212d5520d44480993d7d622a7c4c2da32f6efda0ffa';
let decrypted = decipher.update(encrypted, 'hex', 'utf8');
decrypted += decipher.final('utf8');
console.log(decrypted);
// Prints: some clear text data

복호화는 암호화의 역과정입니다. 주의점도 같습니다. 바로 키 키와 초기 벡터 Initializationvector라는 두 파라미터의 길이입니다. 그리고 주의해야 할 것은 decipher입니다.업데이트 입력의 첫 번째 매개 변수는 문자열일 뿐, 버퍼 형식이 될 수 없습니다. 개인적으로는 버퍼의 성능이 더 좋을 것 같습니다. 나중에 이 형식의 지원이 추가될 수 있습니다.

결어


Nodejs 내장 암호화 모듈을 사용하여 대등한 암호화와 복호화를 실현하는 것에 대한 상세한 설명은 여기 있습니다. 더 많은 Nodejs 대등한 암호화와 복호화 내용은 저희 이전의 글을 검색하거나 아래의 관련 글을 계속 훑어보시기 바랍니다. 앞으로 많은 응원 부탁드립니다!

좋은 웹페이지 즐겨찾기