JavaScriptにおける暗号化・ハッシュ処理の実装パターンとサンプル

概要

Webアプリケーション開発でよく使われるJavaScriptによるデータ保護手法を整理し、即座に使えるコード例を提供します。単なるエンコードから本格的な暗号化まで、目的に応じた選択が可能です。

1. 対称鍵暗号

Base64は厳密には暗号化ではなく、バイナリデータのテキスト表現です。一方、AESは強力な対称鍵暗号として広く利用されています。

<html>
<body>

<h3>Base64変換デモ</h3>
<p>入力: こんにちは、世界!</p>
<p id="base64-output"></p>

<script>
    const source = "こんにちは、世界!";
    const encoded = btoa(encodeURIComponent(source));
    document.getElementById("base64-output").textContent = encoded;
</script>

</body>
</html>
<html>
<head>
    <script src="https://cdn.jsdelivr.net/npm/crypto-js@4.1.1/crypto-js.min.js"></script>
</head>
<body>

<h3>AES-256-CBC 暗号化</h3>
<p>平文: データ保護テスト</p>
<p id="aes-result"></p>

<script>
    const message = "データ保護テスト";
    const secretKey = CryptoJS.enc.Utf8.parse("secure_key_32bytes_long_enough_here");
    const iv = CryptoJS.enc.Utf8.parse("16_byte_iv_value");

    const encrypted = CryptoJS.AES.encrypt(message, secretKey, {
        iv: iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
    });

    document.getElementById("aes-result").textContent = encrypted.toString();
</script>

</body>
</html>

2. 公開鍵暗号

RSAは非対称暗号の代表格。公開鍵で暗号化し、秘密鍵で復号します。大量データには不向きですが、鍵交換や署名に適しています。

<html>
<head>
    <script src="https://cdn.jsdelivr.net/npm/jsencrypt@3.2.1/bin/jsencrypt.min.js"></script>
</head>
<body>

<h3>RSA-2048 暗号化</h3>
<p>送信データ: 機密情報</p>
<p id="rsa-output"></p>

<script>
    const rsa = new JSEncrypt();
    const pubKey = `-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...
-----END PUBLIC KEY-----`;
    
    rsa.setPublicKey(pubKey);
    const result = rsa.encrypt("機密情報");
    document.getElementById("rsa-output").textContent = result;
</script>

</body>
</html>

3. ハッシュ関数

一方向性ハッシュはパスワード保存やデータ整合性チェックに不可欠。MD5は脆弱、SHA-256以上を推奨。

<html>
<head>
    <script src="https://cdn.jsdelivr.net/npm/crypto-js@4.1.1/crypto-js.min.js"></script>
</head>
<body>

<h3>SHA-256 ハッシュ生成</h3>
<p>元データ: integrity_check</p>
<p id="hash-sha256"></p>

<script>
    const input = "integrity_check";
    const hash = CryptoJS.SHA256(input).toString(CryptoJS.enc.Hex);
    document.getElementById("hash-sha256").textContent = hash;
</script>

</body>
</html>

4. 通信層の保護

クライアント側の暗号化だけでは不十分。HTTPS(TLS)による転送中暗号化と組み合わせることで、真のセキュリティが実現します。HTML内では<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">などの設定で強制的に安全な接続を促すことが可能です。

タグ: javascript CryptoJS JSEncrypt AES RSA

5月30日 20:27 投稿