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부터는 저게 된다 함.
여튼 이런 식으로 파일 암복호화가 가능하다.
답글 남기기