nodejs에서 파일 암호화

AES를 이용하여 노드에서 파일 암호화를 해봅시다.

타입스크립트 설정이 매우 귀찮으므로 그냥 자바스크립트

import { parseArgs } from 'node:util'
import crypto from 'node:crypto'
import { readFile, writeFile } from 'node:fs'

async function readFileAsync(path) {
  return new Promise(function (resolve, reject) {
    readFile(path, function (err, data) {
      if (err) reject(err)
      else resolve(data)
    })
  })
}

async function writeFileAsync(path, data) {
  return new Promise(function (resolve, reject) {
    writeFile(path, data, function (err) {
      if (err) reject(err)
      else resolve()
    })
  })
}

async function encryptFile(path, password) {
  const buffer = await readFileAsync(path)
  const key = Buffer.from(password, "utf-8")
  const iv = crypto.randomBytes(16)
  const cipher = crypto.createCipheriv("aes-128-gcm", key, iv)
  return Buffer.concat([iv, cipher.update(buffer), cipher.final()])
}

async function decryptFile(path, password) {
  const buffer = await readFileAsync(path)
  const iv = buffer.slice(0, 16)
  const key = Buffer.from(password, "UTF-8")
  const cipher = crypto.createDecipheriv("aes-128-gcm", key, iv)
  return Buffer.concat([cipher.update(buffer.slice(16))])
}

async function main() {
  const { values } = parseArgs({
    options: {
      file: {
        type: "string",
        short: "f"
      },
      output: {
        type: "string",
        short: "o"
      },
      password: {
        type: "string",
        short: "p"
      },
      type: {
        type: "string",
        short: "t",
        default: "encrypt"
      }
    }
  })

  switch (values.type) {
    case "encrypt":
      const encrypted = await encryptFile(values.file, values.password)
      await writeFileAsync(values.output, encrypted)
      break;
    case "decrypt":
      const decrypted = await decryptFile(values.file, values.password)
      await writeFileAsync(values.output, decrypted)
      break;
    default:
      console.log("Invalid Type")
      break;
  }
}

main()

node 18부터 뭔가 이상한게 추가된 듯 하다. 특히 저 parseArgs가 좀 편하네… arguments 파싱하려고 라이브러리 뒤지다가 요즘에도 다운로드가 많은거 확인해보니 1년전 업데이트라서 하… 쉬바… 하고 있었는데 18.3부터는 저게 된다 함.

여튼 이런 식으로 파일 암복호화가 가능하다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다