logo
Entwicklung
Suchen
AiToken-Verschlüsselung und -Ausstellung

AiToken-Verschlüsselung und -Ausstellung

Überblick

AiToken ist das zentrale Zugangsmerkmal der Arbeitsbereich-Integration – es kapselt die Organisations-ID und die Mitarbeiter-Konto-E-Mail, wird mit einem RSA-Public-Key verschlüsselt und anschließend zu einer dedizierten Anmelde-URL zusammengesetzt, sodass Unternehmensmitarbeiter den Arbeitsbereich in der mobilen APP anmeldefrei öffnen können.


Public-Key abrufen

  1. Öffnen Sie die Web-Oberfläche → BereichsverwaltungErweiterte EinstellungenMarkeIntegration
  2. Suchen Sie im Integrationsbereich den Public-Key und klicken Sie, um ihn anzuzeigen oder zu kopieren
  3. Wenn Sie den Schlüssel aktualisieren müssen (selten, führt dazu, dass alle bereits ausgestellten Token ungültig werden), klicken Sie auf Zurücksetzen

AiToken als Unternehmensmitarbeiter verschlüsseln

Ablaufübersicht

Schritt 1: Mitglieder-E-Mail ─── RSA-Verschlüsselung (Public-Key) ───► emailEncrypted-Bytes Schritt 2: emailEncrypted ─── Base64-Kodierung ───► emailRSAStr Schritt 3: {projectId}:{emailRSAStr} Zeichenkette zusammensetzen Schritt 4: zusammengesetzte Zeichenkette ─── Base64-Kodierung ───► endgültiges AiToken
                      
                      Schritt 1: Mitglieder-E-Mail ─── RSA-Verschlüsselung (Public-Key) ───► emailEncrypted-Bytes
Schritt 2: emailEncrypted ─── Base64-Kodierung ───► emailRSAStr
Schritt 3: {projectId}:{emailRSAStr} Zeichenkette zusammensetzen
Schritt 4: zusammengesetzte Zeichenkette ─── Base64-Kodierung ───► endgültiges AiToken

                    
Dieser Codeblock im schwebenden Fenster

Algorithmus-Parameter

Parameter Wert
RSA-Algorithmus RSA/ECB/PKCS1Padding (d. h. RSAES-PKCS1-V1_5)
Public-Key-Format X.509 (SubjectPublicKeyInfo), Base64-kodiert
Ausgabekodierung zweimal Base64

Java-Verschlüsselungs-Codebeispiel

import java.nio.charset.StandardCharsets; import java.security.KeyFactory; import java.security.PublicKey; import java.security.spec.X509EncodedKeySpec; import java.util.Base64; import javax.crypto.Cipher; public class Main { private static final String RSA_ALGORITHM = "RSA"; private static final String RSA_TRANSFORMATION = "RSA/ECB/PKCS1Padding"; /** * Encrypts data using RSA public key. * * @param data The data to encrypt. * @param publicKeyStr The Base64 encoded RSA public key. * @return Encrypted data bytes. */ public static byte[] encrypt(byte[] data, String publicKeyStr) throws Exception { byte[] publicKeyBytes = Base64.getDecoder().decode(publicKeyStr); X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyBytes); KeyFactory keyFactory = KeyFactory.getInstance(RSA_ALGORITHM); PublicKey publicKey = keyFactory.generatePublic(keySpec); Cipher cipher = Cipher.getInstance(RSA_TRANSFORMATION); cipher.init(Cipher.ENCRYPT_MODE, publicKey); return cipher.doFinal(data); } /** * Generates a login key by encrypting the email and combining with projectId. * * @param projectId The project ID. * @param email The user's email. * @param publicKey The Base64 encoded RSA public key. * @return The final login key string. * @throws Exception if encryption fails. */ public static String generateLoginKey(String projectId, String email, String publicKey) throws Exception { byte[] emailEncrypted = encrypt(email.getBytes(StandardCharsets.UTF_8), publicKey); String emailRSAStr = Base64.getEncoder().encodeToString(emailEncrypted); String keyStr = projectId + ":" + emailRSAStr; return Base64.getEncoder().encodeToString(keyStr.getBytes(StandardCharsets.UTF_8)); } public static void main(String[] args) { String projectId = "your project ID"; String email = "your email"; String publicKey = "your public key"; try { String key = generateLoginKey(projectId, email, publicKey); System.out.println(key); } catch (Exception e) { System.err.println("Failed to generate login key: " + e.getMessage()); } } }
                      
                      import java.nio.charset.StandardCharsets;
import java.security.KeyFactory;
import java.security.PublicKey;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
import javax.crypto.Cipher;

public class Main {

    private static final String RSA_ALGORITHM = "RSA";
    private static final String RSA_TRANSFORMATION = "RSA/ECB/PKCS1Padding";

    /**
     * Encrypts data using RSA public key.
     *
     * @param data         The data to encrypt.
     * @param publicKeyStr The Base64 encoded RSA public key.
     * @return Encrypted data bytes.
     */
    public static byte[] encrypt(byte[] data, String publicKeyStr) throws Exception {
        byte[] publicKeyBytes = Base64.getDecoder().decode(publicKeyStr);
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance(RSA_ALGORITHM);
        PublicKey publicKey = keyFactory.generatePublic(keySpec);

        Cipher cipher = Cipher.getInstance(RSA_TRANSFORMATION);
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        return cipher.doFinal(data);
    }

    /**
     * Generates a login key by encrypting the email and combining with projectId.
     *
     * @param projectId The project ID.
     * @param email     The user's email.
     * @param publicKey The Base64 encoded RSA public key.
     * @return The final login key string.
     * @throws Exception if encryption fails.
     */
    public static String generateLoginKey(String projectId, String email, String publicKey) throws Exception {
        byte[] emailEncrypted = encrypt(email.getBytes(StandardCharsets.UTF_8), publicKey);
        String emailRSAStr = Base64.getEncoder().encodeToString(emailEncrypted);
        String keyStr = projectId + ":" + emailRSAStr;
        return Base64.getEncoder().encodeToString(keyStr.getBytes(StandardCharsets.UTF_8));
    }

    public static void main(String[] args) {
        String projectId = "your project ID";
        String email = "your email";
        String publicKey = "your public key";

        try {
            String key = generateLoginKey(projectId, email, publicKey);
            System.out.println(key);
        } catch (Exception e) {
            System.err.println("Failed to generate login key: " + e.getMessage());
        }
    }
}

                    
Dieser Codeblock im schwebenden Fenster

TypeScript-Verschlüsselungs-Codebeispiel

import * as forge from 'node-forge'; /** * Encrypt data using RSA public key * @param data Data to be encrypted * @param publicKeyStr Base64 encoded public key string * @returns Encrypted byte array */ export function encrypt(data: string, publicKeyStr: string): Uint8Array { try { // Decode Base64 public key const publicKeyBytes = forge.util.decode64(publicKeyStr); // Create public key object const publicKey = forge.pki.publicKeyFromAsn1(forge.asn1.fromDer(publicKeyBytes)); // Use RSA encryption with PKCS1 padding (consistent with Java's default behavior) const encrypted = publicKey.encrypt(data, 'RSAES-PKCS1-V1_5'); // Convert forge's byte string to Uint8Array const bytes = new Uint8Array(encrypted.length); for (let i = 0; i < encrypted.length; i++) { bytes[i] = encrypted.charCodeAt(i) & 0xff; } return bytes; } catch (error) { throw new Error(`RSA encryption failed: ${error}`); } } /** * Convert byte array to Base64 string * @param bytes Byte array * @returns Base64 encoded string */ export function bytesToBase64(bytes: Uint8Array): string { // Convert Uint8Array to string, then use forge's encode64 const binaryString = Array.from(bytes, byte => String.fromCharCode(byte)).join(''); return forge.util.encode64(binaryString); } /** * Convert string to Base64 * @param str String to be encoded * @returns Base64 encoded string */ export function stringToBase64(str: string): string { return forge.util.encode64(str); } /** * Main function - Generate encrypted key string * @param projectId Project ID * @param email Email address * @param publicKey Base64 encoded RSA public key * @returns Final encrypted Base64 string */ export function generateEncryptedKey(projectId: string, email: string, publicKey: string): string { // Use RSA to encrypt email const emailRSAEncrypt = encrypt(email, publicKey); // Convert encryption result to Base64 const emailRSAStr = bytesToBase64(emailRSAEncrypt); // Combine projectId and encrypted email const keyStr = `${projectId}:${emailRSAStr}`; // Encode the entire string with Base64 const result = stringToBase64(keyStr); return result; } // Generate AiToken example // generateEncryptedKey(projectId, email, publicKey)
                      
                      import * as forge from 'node-forge';

/**
 * Encrypt data using RSA public key
 * @param data Data to be encrypted
 * @param publicKeyStr Base64 encoded public key string
 * @returns Encrypted byte array
 */
export function encrypt(data: string, publicKeyStr: string): Uint8Array {
  try {
    // Decode Base64 public key
    const publicKeyBytes = forge.util.decode64(publicKeyStr);

    // Create public key object
    const publicKey = forge.pki.publicKeyFromAsn1(forge.asn1.fromDer(publicKeyBytes));

    // Use RSA encryption with PKCS1 padding (consistent with Java's default behavior)
    const encrypted = publicKey.encrypt(data, 'RSAES-PKCS1-V1_5');

    // Convert forge's byte string to Uint8Array
    const bytes = new Uint8Array(encrypted.length);
    for (let i = 0; i < encrypted.length; i++) {
      bytes[i] = encrypted.charCodeAt(i) & 0xff;
    }
    return bytes;
  } catch (error) {
    throw new Error(`RSA encryption failed: ${error}`);
  }
}

/**
 * Convert byte array to Base64 string
 * @param bytes Byte array
 * @returns Base64 encoded string
 */
export function bytesToBase64(bytes: Uint8Array): string {
  // Convert Uint8Array to string, then use forge's encode64
  const binaryString = Array.from(bytes, byte => String.fromCharCode(byte)).join('');
  return forge.util.encode64(binaryString);
}

/**
 * Convert string to Base64
 * @param str String to be encoded
 * @returns Base64 encoded string
 */
export function stringToBase64(str: string): string {
  return forge.util.encode64(str);
}

/**
 * Main function - Generate encrypted key string
 * @param projectId Project ID
 * @param email Email address
 * @param publicKey Base64 encoded RSA public key
 * @returns Final encrypted Base64 string
 */
export function generateEncryptedKey(projectId: string, email: string, publicKey: string): string {
  // Use RSA to encrypt email
  const emailRSAEncrypt = encrypt(email, publicKey);

  // Convert encryption result to Base64
  const emailRSAStr = bytesToBase64(emailRSAEncrypt);

  // Combine projectId and encrypted email
  const keyStr = `${projectId}:${emailRSAStr}`;

  // Encode the entire string with Base64
  const result = stringToBase64(keyStr);

  return result;
}

// Generate AiToken example
// generateEncryptedKey(projectId, email, publicKey)

                    
Dieser Codeblock im schwebenden Fenster

Dedizierte Anmelde-URL generieren

Generieren Sie die dedizierte Anmelde-URL für das Mitarbeiterkonto im Format {Arbeitsbereich-Integrations-URL}?{AiToken}:

https://gptbots.ai/space/h5/home?AiToken={verschlüsseltes AiToken}&hideClose=true
                      
                      https://gptbots.ai/space/h5/home?AiToken={verschlüsseltes AiToken}&hideClose=true

                    
Dieser Codeblock im schwebenden Fenster

Wenn ein Unternehmensmitarbeiter die dedizierte, verschlüsselte Anmelde-URL für die jeweilige Mitarbeiterkonto-E-Mail in der mobilen APP öffnet, kann er den entsprechenden Arbeitsbereich anmeldefrei öffnen.


Sicherheitshinweise

Hinweis Beschreibung
Public-Key-Sicherheit Der Public-Key darf öffentlich verteilt werden, der Ausstellungsprozess sollte jedoch serverseitig erfolgen, damit der Client die Projekt-ID nicht direkt vorhält
Token-Gültigkeit Das AiToken kennt kein Gültigkeitsdauer-Konzept; es wird empfohlen, es bei der Ausstellung über das Backend auszuliefern und auf der APP-Seite nicht dauerhaft zwischenzuspeichern
E-Mail-Abgleich Die E-Mail im AiToken muss die E-Mail eines bereits im Arbeitsbereich vorhandenen Mitglieds sein, andernfalls wird gemeldet, dass der Benutzer nicht existiert
Organisationsbindung Dieselbe Projekt-ID (projectId) entspricht einer Organisation; das Mitglied muss zu dieser Organisation gehören
HTTPS Auf die Integrations-URL muss über HTTPS zugegriffen werden, um zu verhindern, dass das Token während der Übertragung offengelegt wird

Verwandte Dokumente