Webアプリケーションにおいて、クライアントとサーバー間で送受信されるデータが平文のままでは、パスワードや個人情報などの機密データが第三者に傍受されるリスクがあります。これを防ぐため、通信時にデータを暗号化する必要があります。
代表的な対策として、RSAのような非対称暗号方式を用いた暗号化が有効です。この方式では、サーバー側が公開鍵と秘密鍵のペアを生成し、公開鍵をクライアントに配布します。クライアントはこの公開鍵で送信データを暗号化し、サーバーは自身が保持する秘密鍵で復号します。秘密鍵は絶対に外部に漏らさないよう厳重に管理する必要があります。
以下はHutoolライブラリを用いたJavaでの実装例です。Maven依存関係は以下の通りです:
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.3.5</version>
</dependency>
暗号化・復号処理を行うユーティリティクラスのコードは次のとおりです:
package com.common.utils;
import cn.hutool.core.codec.Base64;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.RSA;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class RsaBase64Utils {
private static final String PUBLIC_KEY = "xxxxxxxxxxx";
private static final String PRIVATE_KEY = "xxxxxxxxxxxxxxxxxxxxxxxx";
/**
* Base64エンコードされた暗号文をRSA秘密鍵で復号
*/
public static String decrypt(String base64EncodedCipher) throws Exception {
try {
RSA rsa = new RSA(PRIVATE_KEY, null);
byte[] decodedBytes = Base64.decode(base64EncodedCipher);
byte[] decryptedBytes = rsa.decrypt(decodedBytes, KeyType.PrivateKey);
return StrUtil.utf8Str(decryptedBytes);
} catch (Exception e) {
throw new Exception("復号処理に失敗しました", e);
}
}
/**
* 平文データをRSA公開鍵で暗号化し、Base64エンコードして返す
*/
public static String encrypt(String plainText) {
RSA rsa = new RSA(null, PUBLIC_KEY);
byte[] plainBytes = StrUtil.bytes(plainText, CharsetUtil.CHARSET_UTF_8);
byte[] encryptedBytes = rsa.encrypt(plainBytes, KeyType.PublicKey);
return Base64.encode(encryptedBytes);
}
public static void main(String[] args) {
RSA keyPair = new RSA();
log.info("Private Key (Base64): {}", keyPair.getPrivateKeyBase64());
log.info("Public Key (Base64): {}", keyPair.getPublicKeyBase64());
}
}