Webプラグイン連結パラメータ暗号化
エントリ:管理センター->インスタントメッセージング->任意のWebプラグイン->PUBLIC KEY
フロントエンドデモ例:
jsencrypt(RSA暗号化/復号化のJavaScriptライブラリ)
2つの使用方法があります
- npmパッケージ管理モード
- jsencryptをインストール
- npm install jsencrypt
- jsencryptをインポート
- import JSEncrypt from 'jsencrypt'
- 使用
javascript var encryptor = new JSEncrypt() // 暗号化オブジェクトインスタンスを作成 var pubKey = '-----BEGIN PUBLIC KEY-----公開鍵-----END PUBLIC KEY-----' encryptor.setPublicKey(pubKey)//公開鍵を設定 var rsaPassWord = encryptor.encrypt('暗号化する内容') // 内容を暗号化 - 直接タグでインポート
- jsencryptをインストール
- 使用
javascript var encryptor = new JSEncrypt() // 暗号化オブジェクトインスタンスを作成 var pubKey = '-----BEGIN PUBLIC KEY-----公開鍵-----END PUBLIC KEY-----' encryptor.setPublicKey(pubKey)//公開鍵を設定 var rsaPassWord = encryptor.encrypt('暗号化する内容') // 内容を暗号化
Javaデモ例:
public class RSAUtils {
/**
* 暗号化アルゴリズムRSA
*/
public static final String KEY_ALGORITHM = "RSA";
/**
* RSA最大暗号化平文サイズ
*/
private static final int MAX_ENCRYPT_BLOCK = 117;
/**
* RSA最大復号化暗号文サイズ
*/
private static final int MAX_DECRYPT_BLOCK = 128;
/**
* 秘密鍵で復号化
* @param encryptedData 暗号化済みデータ
* @param privateKey 秘密鍵(BASE64エンコード)
*/
public static byte[] decryptByPrivateKey(byte[] encryptedData, String privateKey) throws Exception {
byte[] keyBytes = Base64.decodeBase64(privateKey);
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
Key privateK = keyFactory.generatePrivate(pkcs8KeySpec);
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, privateK);
int inputLen = encryptedData.length;
ByteArrayOutputStream out = new ByteArrayOutputStream();
int offSet = 0;
byte[] cache;
int i = 0;
// データをセグメントごとに復号化
while (inputLen - offSet > 0) {
if (inputLen - offSet > MAX_DECRYPT_BLOCK) {
cache = cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK);
} else {
cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);
}
out.write(cache, 0, cache.length);
i++;
offSet = i * MAX_DECRYPT_BLOCK;
}
byte[] decryptedData = out.toByteArray();
out.close();
return decryptedData;
}
/** */
/**
* 公開鍵で暗号化
* @param data 元データ
* @param publicKey 秘密鍵(BASE64エンコード)
*/
public static byte[] encryptByPublicKey(byte[] data, String publicKey) throws Exception {
byte[] keyBytes = Base64.decodeBase64(publicKey);
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
Key publicK = keyFactory.generatePublic(x509KeySpec);
// データを暗号化
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, publicK);
int inputLen = data.length;
ByteArrayOutputStream out = new ByteArrayOutputStream();
int offSet = 0;
byte[] cache;
int i = 0;
// データをセグメントごとに暗号化
while (inputLen - offSet > 0) {
if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {
cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK);
} else {
cache = cipher.doFinal(data, offSet, inputLen - offSet);
}
out.write(cache, 0, cache.length);
i++;
offSet = i * MAX_ENCRYPT_BLOCK;
}
byte[] encryptedData = out.toByteArray();
out.close();
return encryptedData;
}
/**
* 公開鍵で暗号化
*/
public static String encrypted(String data, String publicKey) {
try {
data = Base64.encodeBase64String(encryptByPublicKey(data.getBytes(), publicKey));
} catch (Exception e) {
e.printStackTrace();
}
return data;
}
/**
* 秘密鍵で復号化
*/
public static String decrypt(String data, String privateKey) {
String temp = "";
try {
byte[] rs = Base64.decodeBase64(data);
temp = new String(RSAUtils.decryptByPrivateKey(rs, privateKey),"UTF-8");
} catch (Exception e) {
e.printStackTrace();
}
return temp;
}
public static void main(String args[]){
/**
* {
* "customer": {
* "c_name": "顧客名kimi"
* }
* }
* 正しいjson形式であればOK
*/
String text ="{\n" + "\t\"customer\": {\n" + "\t\t\"c_name\": \"顧客名kimi\"\n" + " }\n" + "} ";
String publicKey="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCGNDmc4+urXmt2lbsyVwQ+MNng/00rCXndESSyW0KBn31N+PdEexKCRI+OrxdSpwHUlXKAmQVYNKYZHJmcEdZ/KAq8IaHrAAogLWoOVKgKhiCUjflBcBVD6E93yQLa+AuMJCvupy6SP6mrzfyA2sZiHgvwPJac8SlNuUAMQ03u4QIDAQAB";
String privateKey="MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAIY0OZzj66tea3aVuzJXBD4w2eD/TSsJed0RJLJbQoGffU3490R7EoJEj46vF1KnAdSVcoCZBVg0phkcmZwR1n8oCrwhoesACiAtag5UqAqGIJSN+UFwFUPoT3fJAtr4C4wkK+6nLpI/qavN/IDaxmIeC/A8lpzxKU25QAxDTe7hAgMBAAECgYB75teSC7NXIfMhJpgPn9rg+AUP/2TlaPhDq0IwEKVUO0VaqZLQfLfX4SiQ2QI1Ys8Dz35JT/1pNCJtaMRBHQ7kLg+PISLXfO6yXDD2roT+ON/SJeOKVzfXXDPwhajpvxLHcbXfaWT8HI37myvDpFs8MAXTZvHoOiOBfqE+l6b8CQJBAPeBWMo+yC93G4UzyDDCx8Lw//fIGSwM0en+VykshCtxkgE+MkOzqKYHtcMxHIdkWr1tHcmVsz431PWwaCj3nwMCQQCKz2FkZLc67pi84QY+/f3zRD+p4DndCqSYh+PnKDpiTMsTzTHi20M5CfMXr0tyb0T9/v6rESnS2JQCySs2HHNLAkAfP1NIZVi8tVriHEF/9ndl4ytNyxNyfkPaOOQkLJybJ4F5arLJ3VrDa2HFPOQPK9pQ4//IvX+dsUrPoe/kjC6lAkAYtptMWHIW1+vxlM6b4HSaHwiGohkrNX3gejElMpBSeAGf4OSE0yzAtvjEurzf/td1sTR+GGwt0cloRZCf7ajJAkEAjWpxheI6hGnINCmMganNkVRwB8YwVNnhvadLFrx6CGNkzVWYVgUHPmXB3k8OtzxTdo8KnutwnGv9PrcgJjdFrA==";
String encryptedStr = RSAUtils.encrypted(text,publicKey);
String decryptStr = RSAUtils.decrypt(encryptedStr,privateKey);
System.out.println("暗号文:"+encryptedStr);
System.out.println("平文:"+decryptStr);
}
}
内容例:
{
"customer": {
"c_name": "顧客名kimi",
"c_email": "newest3@udesk.cn",
"c_other_emails": "11@udesk.cn,22@udesk.cn",
"c_desc": "意向顧客、潜在力大",
"c_org": "desc",
"c_phone": "1100110012",
"c_tags": "ハンサム,新規追加",
"c_owner_group": "62",
"c_owner": "3",
"c_vip": "vip",
"c_qq": "123123",
"c_cf_年齢": 10,
"c_cf_趣味": "エクストリームチャレンジ",
"c_cn_title": "業務記録タイトル",
"c_cn_名前": "業務記録の名前",
"web_token": "newest3@udesk.cn"
}
}
注意:正しいjson形式でなければなりません
例:
String publicKey="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCGNDmc4+urXmt2lbsyVwQ+MNng/00rCXndESSyW0KBn31N+PdEexKCRI+OrxdSpwHUlXKAmQVYNKYZHJmcEdZ/KAq8IaHrAAogLWoOVKgKhiCUjflBcBVD6E93yQLa+AuMJCvupy6SP6mrzfyA2sZiHgvwPJac8SlNuUAMQ03u4QIDAQAB";
String privateKey="MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAIY0OZzj66tea3aVuzJXBD4w2eD/TSsJed0RJLJbQoGffU3490R7EoJEj46vF1KnAdSVcoCZBVg0phkcmZwR1n8oCrwhoesACiAtag5UqAqGIJSN+UFwFUPoT3fJAtr4C4wkK+6nLpI/qavN/IDaxmIeC/A8lpzxKU25QAxDTe7hAgMBAAECgYB75teSC7NXIfMhJpgPn9rg+AUP/2TlaPhDq0IwEKVUO0VaqZLQfLfX4SiQ2QI1Ys8Dz35JT/1pNCJtaMRBHQ7kLg+PISLXfO6yXDD2roT+ON/SJeOKVzfXXDPwhajpvxLHcbXfaWT8HI37myvDpFs8MAXTZvHoOiOBfqE+l6b8CQJBAPeBWMo+yC93G4UzyDDCx8Lw//fIGSwM0en+VykshCtxkgE+MkOzqKYHtcMxHIdkWr1tHcmVsz431PWwaCj3nwMCQQCKz2FkZLc67pi84QY+/f3zRD+p4DndCqSYh+PnKDpiTMsTzTHi20M5CfMXr0tyb0T9/v6rESnS2JQCySs2HHNLAkAfP1NIZVi8tVriHEF/9ndl4ytNyxNyfkPaOOQkLJybJ4F5arLJ3VrDa2HFPOQPK9pQ4//IvX+dsUrPoe/kjC6lAkAYtptMWHIW1+vxlM6b4HSaHwiGohkrNX3gejElMpBSeAGf4OSE0yzAtvjEurzf/td1sTR+GGwt0cloRZCf7ajJAkEAjWpxheI6hGnINCmMganNkVRwB8YwVNnhvadLFrx6CGNkzVWYVgUHPmXB3k8OtzxTdo8KnutwnGv9PrcgJjdFrA==";
リクエスト例:https://xxx.udesk.cn/im_client/?web_plugin_id=xxx&nonce=1685331807906×tamp=1685331807906&signature=166B6CCE7DF07F14E2D12796951BC9FC4348B47E&customer_encrypt=【暗号化後の内容】
web_tokenはcustomer_encryptに配置できます。パラメータ内容は上記のjson形式に従って暗号化してください。