node.js 및 클라이언트 측에서 Fullstack AES-GCM 암호화 복호화

2541 단어 encryptioncryptonode
TL;DR
완전히 실행 가능한 요지 코드here를 찾을 수 있습니다.

AES(Advanced Encryption Standard)는 여기에서 더 읽을 수 있는 다양한 모드가 있는 대칭적인 종류의 암호화 방법입니다.
더 이상 요점에 도달합시다. 서버 측(Node.js)에서 일부 메시지를 암호화하고 암호화된 메시지를 클라이언트 측으로 다시 보내고 싶었습니다. React, Vue, Angular, 바닐라 JS 등
암호화 항목은 민감하기 때문에 브라우저에서 즉시 제공하는 네이티브 API를 사용하고 싶었지만 AES-GCM 방식에 대한 리소스가 부족하여 이상한 문제가 발생했지만 결국 솔루션을 사용했습니다.
이것은 서버 측(node.js)에서 실행되어야 하는 코드입니다.

function encrypt(message){
  const KEY = crypto.randomBytes(32)
  const IV = crypto.randomBytes(16)
  const ALGORITHM = 'aes-256-gcm';

  const cipher = crypto.createCipheriv(ALGORITHM, KEY, IV);
  let encrypted = cipher.update(message, 'utf8', 'hex');
  encrypted += cipher.final('hex');
  const tag = cipher.getAuthTag()

  let output = {
    encrypted,
    KEY: KEY.toString('hex'),
    IV: IV.toString('hex'),
    TAG: tag.toString('hex'),
  }
  return output;
}


그리고 이것은 클라이언트 측(브라우저)에서 실행되어야 하는 코드입니다.

function decrypt() {
  let KEY = hexStringToArrayBuffer(data.KEY);
  let IV = hexStringToArrayBuffer(data.IV);
  let encrypted = hexStringToArrayBuffer(data.encrypted + data.TAG);

  window.crypto.subtle.importKey('raw', KEY, 'AES-GCM', true, ['decrypt']).then((importedKey)=>{
    console.log('importedKey: ', importedKey);
    window.crypto.subtle.decrypt(
      {
        name: "AES-GCM",
        iv: IV,
      },
      importedKey,
      encrypted
    ).then((decodedBuffer)=>{
      let plaintext = new TextDecoder('utf8').decode(decodedBuffer);
      console.log('plainText: ', plaintext);
    })
 })

function hexStringToArrayBuffer(hexString) {
  hexString = hexString.replace(/^0x/, '');
  if (hexString.length % 2 != 0) {
    console.log('WARNING: expecting an even number of characters in the hexString');
  }
  var bad = hexString.match(/[G-Z\s]/i);
  if (bad) {
      console.log('WARNING: found non-hex characters', bad);    
  }
  var pairs = hexString.match(/[\dA-F]{2}/gi);
  var integers = pairs.map(function(s) {
      return parseInt(s, 16);
  });
  var array = new Uint8Array(integers);
  return array.buffer;
} 


코드가 충분히 표현할 수 있다고 생각하지만 암호화된 태그와 인증 태그를 함께 연결하여 미묘한 암호화 API의 암호 해독 메서드에 전달해야 합니다.

질문이 있으시면 댓글로 알려주세요 ;)

좋은 웹페이지 즐겨찾기