フロントエンドとバックエンドの相互作用、パスワード暗号化、RSA はフロントエンド JS 暗号化、バックエンド Go 復号化を実装します。

RSA 暗号化アルゴリズムの概要

比較的一般的な非対称暗号化アルゴリズムで、フロントエンドとバックエンドの対話におけるパスワード暗号化によく使用されます。フロントエンドは公開キーを使用してパスワードを暗号化し、バックエンドは秘密キーを使用して復号化します。公開鍵は外部に公開することができ、秘密鍵はサーバー上に保管されており、通常は外部から復号用秘密鍵を取得することはできません。

以下は百度百科事典からの部分的な説明です:
RSA公開キー暗号化は、異なる暗号化キーと復号化キーを使用する暗号システムです。「既知の暗号化キーから復号化キーを導出するのは計算上不可能です。」

公開鍵暗号方式では、暗号化鍵 (公開鍵) はPK公開情報ですが、復号化鍵 (秘密鍵) はSK秘密にしておく必要があります。暗号化アルゴリズムEと復号化アルゴリズムDも公開されています。復号化キーはSK公開キーによってPK決まりますが、それPKに基づいて計算することはできませんSK

公開鍵、秘密鍵を生成する

  1. goEncrypt
    関数を直接呼び出すと、秘密鍵ファイルと公開鍵ファイルをGetRsaKeyローカルに生成できます。private.pempublic.pem

    func main() {
          
          
    	goEncrypt.GetRsaKey()
    }
    
  2. openssl
    秘密鍵を生成する

    openssl genrsa -out rsa_1024_priv.pem 1024
    

    公開鍵を生成する

    openssl rsa -pubout -in rsa_1024_priv.pem -out rsa_1024_pub.pem
    

フロントエンドはjs公開キー暗号化を使用します

まず主人公を紹介します。jsencrypt.min.jsファイルはリポジトリhttps://github.com/travist/jsencryptbinのディレクトリにあります。

基本的な使い方:

var encrypt = new JSEncrypt();
encrypt.setPublicKey(`-----BEGIN  WUMAN  RSA PUBLIC KEY -----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA29fttcEDUvhGJEhQXEIH
8blptZRF5itec4GtEGtkSr4Wjmsf2o2XKOr6YEbTOeDA/DdnDSbVzK2ZUscqyBxb
KGwI/Bpv9l5K/sh9+Oj2Y8YH53+XkqRSGvmhHqolhb+gcfH+FKG5IflGuiOREs4h
02TVmPAFPTmZjYBeVexJgmPodGPOe36QVnMeOG8tHOFxItkMvJUpilzs85xdHqTT
jWCtk/SjHrp5NGSkHSmionOtrFiksS/gTX0EzrptmAGHTjZV0NX7Nu8Ma45rVdMR
wXrDPbk0yR0iFdBEZ1ceGsNg2VjrZ3LCZi3zO+ieA7sBjHARHai5MuFlh9KJ8+Yk
wwIDAQAB
-----END  WUMAN  RSA PUBLIC KEY -----`);
var encrypted = encrypt.encrypt("test");

encryptedこれは、バックエンドに渡される暗号化された文字列です。test公開キーを使用した暗号化後:mFWBdT4Y70ZNEQ7PVIFKwbkefufu52WGXYLrW0Vk1XuajrrEE54dqj4VK2yuGIeMq5bHKAdkDnACB2ABzHLQuobTDpkS0Nj5AlJvwbRDV3pOCB1x0q3aqEooTppeMs8P/WG3YCRDTQPWgZISPsFBQVT1tk77BiImcY4SZM9IL0B4TFUKS9sShnjAebxmJkj8jfYYh7gNzUY0YMvOV6HuiT5C0RsbTe1jwMyN87QEwvpvuPelkeQ8LX1AG+qsn2q4TvOYEKCNfNnePjMIQ/5MlesledwiqUpc/YtY3qj4Qx+8b5luaQ6kyu+zyOXV/A0XjjxIxqLWKU8eAl7eA3o72Q==

バックエンドはgo秘密キーを使用して復号化します

主人公: github.com/wmansgy/goEncrypt

注: JSEncrypt取得したものはbase64変換されるため、最初に変換する必要がありますbase64

基本的な使い方:

package main

import (
	"fmt"
	"encoding/base64"
	"github.com/wumansgy/goEncrypt"
)

var privateKey = []byte(`-----BEGIN  WUMAN RSA PRIVATE KEY -----
MIIEpgIBAAKCAQEA29fttcEDUvhGJEhQXEIH8blptZRF5itec4GtEGtkSr4Wjmsf
2o2XKOr6YEbTOeDA/DdnDSbVzK2ZUscqyBxbKGwI/Bpv9l5K/sh9+Oj2Y8YH53+X
kqRSGvmhHqolhb+gcfH+FKG5IflGuiOREs4h02TVmPAFPTmZjYBeVexJgmPodGPO
e36QVnMeOG8tHOFxItkMvJUpilzs85xdHqTTjWCtk/SjHrp5NGSkHSmionOtrFik
sS/gTX0EzrptmAGHTjZV0NX7Nu8Ma45rVdMRwXrDPbk0yR0iFdBEZ1ceGsNg2Vjr
Z3LCZi3zO+ieA7sBjHARHai5MuFlh9KJ8+YkwwIDAQABAoIBAQCyBCtMXbqfWMMT
ZisMSbu9FPJwQlxHgR6+UWceQJe5nisNr9jfVH/udje/9hncaA5dLU+Y6rV9Q6U/
zl7qI2v9U14DJjU7PidkIF1BTQMWz6he4IaQC9cgWLsK5aP0pbL6EYY4lqwewodu
+pXisF/bmW8MpG7ZoOaiGixJT0hG97aS3YD506RqdnK4a9yG5ycoVUZTzFTIM+aq
MCTOWJLbHJBnY52v7Rqaor1jZ0o+C/Cykbts25VHWZ9ygxBfI/S75jTg/zibpqbo
TnICGBqzzfAsThHYiji3ZgEF2bSadxQZ956Rvm5Dlhk0A6ylwKl1gJTAxyZNRjx2
zogLHNFhAoGBAP3TmQSpyYtjr8xdD+AsinMi3q3p/6+FPBh5wrV9Dvd5aSrKCYnU
j/9LOYmCP6JfKc90K3L0PKTfS1LDZXHoeYpzxB0uD2iTIkYQKraUp7rzqLBMkdTB
nTuOByqnTB45WlWlfy6m/8CO+0r5DkrO1fU8gWkg3+bUQoUTPOhuFkqdAoGBAN25
1oVmFyDvxw62WZ95SPktqzmErFH/X+7wpGInUb0vxnGJ0SP2bVgMLyL9Ecz8p5hC
ZEZVbo/WFs17hqz8Z6Xx4Gq7aoredpsZswpApdODs5sQf72LXj4Cuf1iwMGIyQxa
8hElV9uRIeKfEG2E/HBLLPO8qhGBCsWIT1Jms97fAoGBAPQFIf2usTkVXCPvb9zH
VU79PfEanhoCz9SD8mGCWgomqaleVK8yMEFx8120XzLdpBdyCndYQJkMpqBpgzRw
F7C4PNkEuAGEOhX7YuTmox4DM7BR3H0aqetgTpl9/pqr7qGaGlwiZoubqhDYwRnA
IUfDpHIKDdcfRtgit5KIi1utAoGBAKqoAK8IFsEpDGMMgwq1hS8UsXdB4If0MNht
q3hInycoAGsfEjPF1f8w0Y7yjaLiy/PrFdb0pnZa544ch1nZo8Ub2AkOW0CrXUqf
iyhW/ctA0RqGpmszO8QqwRB/07CiIWw7C5maznaWzCfrGe/RraKYme63xYZXdfz3
n2Xi2oqtAoGBAPB2SL1UafzZiC70e+NeDeaCLTCorCvIrN73RngYXU1OKUynrcjL
xOs8yVFs5cK0sNwEkiozcldfOfU2j70tyrGz+txi5+Db6ex5VXmEKSqdZXRDtqqc
KKRFfpuebqdaR50SDa4Lq6JbqYtwg0CLZeju4Mq41i9F2p4myqVDUsZs
-----END  WUMAN RSA PRIVATE KEY -----
`)

func main() {
    
    
	ciphertext, err := base64.StdEncoding.DecodeString(`mFWBdT4Y70ZNEQ7PVIFKwbkefufu52WGXYLrW0Vk1XuajrrEE54dqj4VK2yuGIeMq5bHKAdkDnACB2ABzHLQuobTDpkS0Nj5AlJvwbRDV3pOCB1x0q3aqEooTppeMs8P/WG3YCRDTQPWgZISPsFBQVT1tk77BiImcY4SZM9IL0B4TFUKS9sShnjAebxmJkj8jfYYh7gNzUY0YMvOV6HuiT5C0RsbTe1jwMyN87QEwvpvuPelkeQ8LX1AG+qsn2q4TvOYEKCNfNnePjMIQ/5MlesledwiqUpc/YtY3qj4Qx+8b5luaQ6kyu+zyOXV/A0XjjxIxqLWKU8eAl7eA3o72Q==`)
	if err != nil {
    
    
		return 
	}

	plaintext, err := goEncrypt.RsaDecrypt(ciphertext, privateKey)
	if err != nil {
    
    
		return 
	}
	fmt.Println("明文:", string(plaintext)) // test
}

参考

jsencrypt
goEncrypt
Baidu 百科事典 RSA アルゴリズム

Guess you like

Origin blog.csdn.net/DisMisPres/article/details/122070167