암호화는 데이터를 지정된 수신자만 이해할 수 있는 형식으로 변환하여 보호합니다. 이는 비밀번호, 온라인 거래 및 민감한 통신을 보호하는 데 필수적입니다. 아래에서는 암호화, 해싱 및 JavaScript를 사용하여 구현하는 방법에 대해 알아봅니다.
암호화는 읽을 수 있는 데이터(일반 텍스트)를 읽을 수 없는 형식(암호문)으로 변환합니다. 승인된 당사자만이 절차를 취소할 수 있습니다.
주요 개념:
암호화와 복호화에 동일한 키를 사용합니다. 키는 발신자와 수신자 간에 안전하게 공유되어야 합니다. AES는 데이터를 읽을 수 없는 형식으로 변환하여 데이터를 보호하는 널리 사용되는 유형의 대칭 암호화 알고리즘입니다. 비밀 키를 사용하고 128, 192 또는 256비트 키 길이를 지원하여 무단 액세스로부터 강력한 보호 기능을 제공합니다. AES는 다음과 같은 경우에 필수적입니다.
AES의 핵심 요소로는 키와 초기화 벡터(IV)가 있습니다. 키는 당사자 간에 공유되는 비밀 값으로, 데이터 암호화 및 해독 방법을 결정하며 항상 기밀로 유지되어야 합니다. IV는 동일한 일반 텍스트가 다른 암호문으로 암호화되도록 키와 함께 사용되는 무작위 값으로, 패턴 인식을 방지하기 위해 무작위성을 추가합니다. IV는 공개될 수 있지만 동일한 키로 재사용해서는 안 됩니다. 이러한 요소를 통해 AES는 사이버 위협에 효과적으로 대응하여 데이터 보안의 초석이 됩니다.
AES는 무작위성을 추가하기 위해 공유 키와 초기화 벡터(IV)를 사용하여 데이터를 암호화합니다.
const crypto = require('crypto'); const algorithm = 'aes-256-cbc'; const key = crypto.randomBytes(32); const iv = crypto.randomBytes(16); function encrypt(text) { const cipher = crypto.createCipheriv(algorithm, key, iv); let encrypted = cipher.update(text, 'utf8', 'hex'); encrypted += cipher.final('hex'); return { encrypted, iv: iv.toString('hex'), key: key.toString('hex') }; } function decrypt(encrypted, ivHex, keyHex) { const decipher = crypto.createDecipheriv(algorithm, Buffer.from(keyHex, 'hex'), Buffer.from(ivHex, 'hex')); let decrypted = decipher.update(encrypted, 'hex', 'utf8'); decrypted += decipher.final('utf8'); return decrypted; } // Usage const message = "Secret Message"; const encryptedData = encrypt(message); console.log("Encrypted:", encryptedData); const decryptedMessage = decrypt(encryptedData.encrypted, encryptedData.iv, encryptedData.key); console.log("Decrypted:", decryptedMessage);
안전한 암호화 시스템을 만들려면 비대칭 암호화가 해결책인 경우가 많습니다. 두 개의 키, 즉 암호화용 공개 키와 복호화용 개인 키를 사용합니다. 이 설정을 사용하면 단일 키를 공유하지 않고도 보안 통신이 가능합니다.
키 쌍 생성
공개-개인 키 쌍이 생성됩니다. 공개 키는 공개적으로 공유되지만 개인 키는 기밀로 유지됩니다.
암호화
수신자의 공개 키는 데이터를 암호화합니다. 오직 개인 키만이 이를 해독할 수 있어, 가로채더라도 데이터를 안전하게 유지할 수 있습니다.
복호화
수신자는 개인 키를 사용하여 데이터를 해독합니다.
const crypto = require('crypto'); const algorithm = 'aes-256-cbc'; const key = crypto.randomBytes(32); const iv = crypto.randomBytes(16); function encrypt(text) { const cipher = crypto.createCipheriv(algorithm, key, iv); let encrypted = cipher.update(text, 'utf8', 'hex'); encrypted += cipher.final('hex'); return { encrypted, iv: iv.toString('hex'), key: key.toString('hex') }; } function decrypt(encrypted, ivHex, keyHex) { const decipher = crypto.createDecipheriv(algorithm, Buffer.from(keyHex, 'hex'), Buffer.from(ivHex, 'hex')); let decrypted = decipher.update(encrypted, 'hex', 'utf8'); decrypted += decipher.final('utf8'); return decrypted; } // Usage const message = "Secret Message"; const encryptedData = encrypt(message); console.log("Encrypted:", encryptedData); const decryptedMessage = decrypt(encryptedData.encrypted, encryptedData.iv, encryptedData.key); console.log("Decrypted:", decryptedMessage);
해싱은 데이터를 고정 길이의 되돌릴 수 없는 문자열(해시)로 변환합니다. 일반적으로 데이터 무결성을 확인하고 비밀번호를 안전하게 저장하는 데 사용됩니다.
인기 해싱 알고리즘:
Node.js에서 문자열 해싱의 예
const crypto = require('crypto'); // Generate keys const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', { modulusLength: 2048 }); const data = "Confidential Data"; // Encrypt const encrypted = crypto.publicEncrypt(publicKey, Buffer.from(data)); console.log("Encrypted:", encrypted.toString('base64')); // Decrypt const decrypted = crypto.privateDecrypt(privateKey, encrypted); console.log("Decrypted:", decrypted.toString());
Feature | Encryption | Hashing |
---|---|---|
Process | Two-way (encrypt/decrypt) | One-way |
Purpose | Data confidentiality | Data integrity |
Reversible | Yes | No |
Example | AES, RSA | SHA-256, bcrypt |
내 프로젝트 Whisper에서는 익명 채팅 메시지를 보호하기 위해 비대칭 암호화를 사용했습니다. 메시지는 수신자의 공개 키로 암호화되므로 수신자만 개인 키를 사용하여 메시지를 해독할 수 있습니다.
클라이언트 측 React 구현의 경우 암호화 및 복호화에 crypto-js를 사용했습니다.
const crypto = require('crypto'); const algorithm = 'aes-256-cbc'; const key = crypto.randomBytes(32); const iv = crypto.randomBytes(16); function encrypt(text) { const cipher = crypto.createCipheriv(algorithm, key, iv); let encrypted = cipher.update(text, 'utf8', 'hex'); encrypted += cipher.final('hex'); return { encrypted, iv: iv.toString('hex'), key: key.toString('hex') }; } function decrypt(encrypted, ivHex, keyHex) { const decipher = crypto.createDecipheriv(algorithm, Buffer.from(keyHex, 'hex'), Buffer.from(ivHex, 'hex')); let decrypted = decipher.update(encrypted, 'hex', 'utf8'); decrypted += decipher.final('utf8'); return decrypted; } // Usage const message = "Secret Message"; const encryptedData = encrypt(message); console.log("Encrypted:", encryptedData); const decryptedMessage = decrypt(encryptedData.encrypted, encryptedData.iv, encryptedData.key); console.log("Decrypted:", decryptedMessage);
복호화에는 개인 키가 사용됩니다.
const crypto = require('crypto'); // Generate keys const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', { modulusLength: 2048 }); const data = "Confidential Data"; // Encrypt const encrypted = crypto.publicEncrypt(publicKey, Buffer.from(data)); console.log("Encrypted:", encrypted.toString('base64')); // Decrypt const decrypted = crypto.privateDecrypt(privateKey, encrypted); console.log("Decrypted:", decrypted.toString());
자세한 예를 보려면 Whisper의 코드를 살펴보세요.
암호화는 애플리케이션의 데이터 보안을 강화합니다. 공유 키 시나리오에는 AES와 같은 대칭 암호화를 사용하고 공개-개인 키 시스템에는 비대칭 암호화를 사용합니다. 해싱은 특히 비밀번호의 경우 데이터 무결성을 보장합니다. 애플리케이션 요구 사항에 따라 올바른 암호화 접근 방식을 선택하세요.
공유 키에 대해 자세히 알아보기
공개 키에 대해 자세히 알아보세요
SHA-256에 대해 자세히 알아보세요
SHA-3에 대해 자세히 알아보세요
MD5에 대해 자세히 알아보세요
SHA-1에 대해 자세히 알아보세요
대칭 암호화에 대해 자세히 알아보세요
AES에 대해 자세히 알아보세요
읽어주셔서 감사합니다. 이에 대한 여러분의 생각을 알려주세요. 더 보고 싶으시다면, 제가 실수했거나 놓친 부분이 있다고 생각하시면 주저하지 마시고 댓글을 남겨주세요
위 내용은 JavaScript의 암호화: 실용 가이드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!