フロントエンドとバックエンドのやり取り中のデータ暗号化の目的は何ですか?

Web ページを開発する初心者にとって、データ暗号化に関する誤解は常に発生します。特に、初めて関連するコードに触れたり、いくつかのユースケースを読んだりするとき、90% の人は必然的に「目的は何なのか」という質問を考えるでしょう。フロントエンドとバックエンドの暗号化と復号化。

たとえば次のコード

  1. バックエンド暗号化コード
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class EncryptionUtil {
    
    

	//加密使用AES算法、加密的秘钥Key
    private static final String ALGORITHM = "AES/CBC/PKCS7Padding";
    private static final String KEY = "mysecretkey12345";

    public static String encrypt(String value) throws Exception {
    
    
    	//生成密钥的规范类,传入Key和使用的算法
        SecretKeySpec secretKeySpec = new SecretKeySpec(KEY.getBytes(), ALGORITHM);
        //获取对应加密算法的执行类
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        //初始化,指定运行模式为加密,并传入加密规范类
        IvParameterSpec iv = new IvParameterSpec(KEY.getBytes());
        cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec,iv);
        //加密数据,并把加密后的数据使用base64第二次加密
        byte[] encryptedValue = cipher.doFinal(value.getBytes());
        return Base64.getEncoder().encodeToString(encryptedValue);
    }

    public static String decrypt(String value) throws Exception {
    
    
        SecretKeySpec secretKeySpec = new SecretKeySpec(KEY.getBytes(), ALGORITHM);
        Cipher cipher = Cipher.getInstance(ALGORITHM + "/CBC/PKCS7Padding");
        //指定运行模式为解密
        IvParameterSpec iv = new IvParameterSpec(KEY.getBytes());
        cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, iv);
        byte[] decodedValue = Base64.getDecoder().decode(value);
        byte[] decryptedValue = cipher.doFinal(decodedValue);
        return new String(decryptedValue);
    }
}
  1. フロントエンド暗号化コード
function encrypt(value) {
    
    
	//加密的key、初始化向量iv
    var key = CryptoJS.enc.Utf8.parse('mysecretkey12345');
    //向量可以和key不同,iv只是用来决定加密算法内部在加密时的加密强度
    var iv = CryptoJS.enc.Utf8.parse('mysecretkey12345');
    var encrypted = CryptoJS.AES.encrypt(CryptoJS.enc.Utf8.parse(value), key,
        {
    
    
            keySize: 16,
            iv: iv,
            //加解密用到的模式
            mode: CryptoJS.mode.CBC,
            //填充模式,原始数据的长度不是加密算法所要求的块长度的整数倍,就需要进行填充
            padding: CryptoJS.pad.Pkcs7
        });
    return encrypted.toString(CryptoJS.enc.Base64);
}

function decrypt(value) {
    
    
    var key = CryptoJS.enc.Utf8.parse('mysecretkey12345');
    var iv = CryptoJS.enc.Utf8.parse('mysecretkey12345');
    var decryptedStr = CryptoJS.enc.Base64.parse(value).toString(CryptoJS.enc.Utf8);
    var decrypted = CryptoJS.AES.decrypt(decryptedStr, key,
        {
    
    
            keySize: 16,
            iv: iv,
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7
        });
    return decrypted.toString(CryptoJS.enc.Utf8);
}
  1. 使用例

バックエンド暗号化:

String plainText = "Hello World!";
String encryptedText = EncryptionUtil.encrypt(plainText);
System.out.println("加密数据为: " + encryptedText);

バックエンドの復号化:

String encryptedText = "加密数据";
String decryptedText = EncryptionUtil.decrypt(encryptedText);
System.out.println("解密数据为: " + decryptedText);

フロントエンド暗号化:

var plainText = "Hello World!";
var encryptedText = encrypt(plainText);
console.log("加密数据为: " + encryptedText);

フロントエンドの復号化:

var encryptedText = "解密数据";
var decryptedText = decrypt(encryptedText);
console.log("解密数据: " + decryptedText);

上記のコードは、フロントエンドとバックエンドのデータ対話で使用される AES 暗号化および復号化コードです。多くの初心者は、フロントエンドの暗号化を考えてから、それをバックエンドに渡し、バックエンドで復号化することを考えたことがあるはずです。この一連のプロセスの目的は何ですか、直感的に この一連のプロセスを見るのは少し不要ですが、実はハッキング技術には、ネットワーク間の通信のネットワーク層のデータを傍受して改ざんするという前后端数据交互时的加密,不是给前端或者后端自己使用的,而是为了不让数据明文形式在网络层传输攻撃手法があります。中间人攻击データの暗号化は、攻撃の目的を達成するために、クライアントとサーバーの間で行われ、重要なデータがネットワーク層で傍受された後、関係者によって直接使用されることを防ぐために行われます。

しかし、上記の暗号化方法は包括的ではなく、2 つの欠点があります。1 つ目は、攻撃者の目的がデータ自体の内容ではなく、単に Web サイトを汚染することである場合、何も問題ありません。データが傍受された後は、暗号化するかどうかに関係なく、代わりに他のダーティ データを直接使用します。2 つ目は、データ暗号化の一般的な問題は、キーのセキュリティをどのように確保するかということです。キーはクライアントに置くことができず、そうしないと簡単に紛失してしまいます。また、キーがサーバーに置かれている場合、いつクライアントが使用する にアクセスする必要があり、アクセスする際にはネットワーク層で中間者攻撃に直面する必要があり、キー自体を暗号化することはできません。そうしないと、無限の人形の巣になってしまいます。例えば、相応の対策を講じなければ、自分で書き込んだフロントエンドおよびバックエンドデータの暗号鍵が失われるのは時間の問題です。

最初の質問については、暗号化アルゴリズムの開発において、 と呼ばれる別の暗号化ジャンルが登場しました。数据签名その中心となるアイデアは、暗号化する重要なデータを選択して署名データを形成し、バックエンドで重要なデータの署名を再構成し、校正を行うことです。オリジナルの署名テスト付き。2 番目の問題に関しては、これを解決する最も安全な方法は、https プロトコルを使用し、プロトコル自体のセキュリティに依存してこの問題を解決することです。また、HTTP プロトコルを使用すると、フロントエンドとバックエンドのデータ通信の暗号化を自分で記述する必要がなくなります。プロトコル自体がこの種のセキュリティを提供します。現時点では、元のネットワーク層の暗号化によって、クライアントまたはサーバー自身のデータの暗号化に使用されると同時に、ローカル変数がクライアントによって監視できない機能がキーのセキュリティを確保するために使用されます。

おすすめ

転載: blog.csdn.net/dudadudadd/article/details/131340991