Kapitel 2

Checksum og godkendelse

Hvert BigBlueButton API-kald skal inkludere en checksum beregnet ud fra serverens shared secret. Denne mekanisme forhindrer uautoriseret adgang og beskytter API-requests mod manipulation.

Sådan fungerer det

BBB API'et bruger en shared-secret-model: både serveren og den kaldende applikation kender den samme secret. Secret'en overføres aldrig direkte — i stedet bruges den som input til et kryptografisk hash, som tilføjes til hver request som parameteren checksum.

shared secret må aldrig eksponeres for slutbrugere. Den hører udelukkende hjemme i den server-side-konfiguration, som den integrerende applikation bruger. Indlej den aldrig i JavaScript, mobilapps eller anden klient-side-kode.

Hentning af Shared Secret

Hemmeligheden er gemt på BigBlueButton-serveren i /etc/bigbluebutton/bbb-web.properties som egenskaben securitySalt. Du kan hente den ved at køre følgende kommando på serveren:

# On the BBB server:
sudo bbb-conf --secret

Eksempel på output:

URL: https://api-guide.bbbserver.com/bigbluebutton/
Secret: replace-with-secret

Beregning af Checksum (trin for trin)

Følgende eksempel demonstrerer, hvordan man beregner checksum for et create API-kald ved hjælp af SHA-256.

— saml alle parametre undtagen checksum:

name=Demo&meetingID=replace-with-meeting-id&attendeePW=replace-with-password&moderatorPW=replace-with-password

Prepend API-metodenavnet (uden nogen separator):

createname=Demo&meetingID=replace-with-meeting-id&attendeePW=replace-with-password&moderatorPW=replace-with-password

Tilføj shared secret til sidst (uden nogen separator):

createname=Demo&meetingID=replace-with-meeting-id&attendeePW=replace-with-password&moderatorPW=replace-with-passwordreplace-with-secret

Beregn hash ved hjælp af den valgte algoritme (SHA-256 i dette eksempel):

SHA-1:   7030bd96ede6a7ac41da848fe3bfc562e52a5914
SHA-256: 7e5a0a48f1542462e56ca034dc83d741bff1deb5feab0cd9ef74fa6e009fe1fd

Tilføj checksum til query-strengen som parameteren checksum:

name=Demo&meetingID=replace-with-meeting-id&attendeePW=replace-with-password&moderatorPW=replace-with-password&checksum=7e5a0a48f1542462e56ca034dc83d741bff1deb5feab0cd9ef74fa6e009fe1fd

Understøttede Hash-algoritmer

BigBlueButton understøtter flere hash-algoritmer til beregning af checksum. Følgende tabel viser alle tilgængelige muligheder:

Algoritme Tilgængelig siden Hash-længde
SHA-1 Alle versioner 40 tegn
SHA-256 BBB 2.4 64 tegn
SHA-384 BBB 2.5 96 tegn
SHA-512 BBB 2.5 128 tegn

De understøttede algoritmer konfigureres på serversiden i /etc/bigbluebutton/bbb-web.properties:

supportedChecksumAlgorithms=sha256,sha384,sha512

Hvis en algoritme fjernes fra denne liste, deaktiveres den på serveren. Som standard er alle fire algoritmer aktiveret.

SHA-1 anses for forældet. Brug SHA-256 eller højere til nye implementeringer. Hold kun SHA-1 aktiveret, hvis du har brug for bagudkompatibilitet med ældre integrationer.

POST-requests

Når du laver POST-requests til BigBlueButton API'et, skal du huske følgende regler:

  • checksum beregnes udelukkende ud fra URL-query-strengen.
  • POST-body'en (f.eks. præsentations-XML eller clientSettingsOverride) er ikke inkluderet i beregningen af checksum.
  • Alle parametre, der skal være en del af checksum, skal placeres i query-strengen.

Konfiguration af breakout-rum

Hvis du deaktiverer understøttelse af SHA-256, skal du også opdatere indstillingen checkSumAlgorithmForBreakouts i /etc/bigbluebutton/bbb-apps-akka.conf for at sikre, at grupperum fortsat fungerer korrekt.

Bedste praksis for sikkerhed

  • Opbevar kun den delte hemmelighed på serversiden — aldrig i JavaScript, mobilapps eller andre klient-sidekontekster.
  • Brug altid HTTPS for at beskytte tjeksummen og parametrene under overførsel.
  • Hvis du har mistanke om, at hemmeligheden er blevet kompromitteret, skal du straks rotere den ved hjælp af bbb-conf --setsecret <new-secret>.
  • Mekanismen tjeksum beskytter mod manipulation, men ikke mod replay-angreb. For join-URL'er bør du overveje at bruge parameteren createTime for at begrænse gyldigheden.

Når du genererer join-links til brugere, skal du inkludere parameteren createTime fra det oprindelige create-svar. Dette sikrer, at join-linket kun er gyldigt for den specifikke mødeinstans.

Kodeeksempler

De følgende eksempler demonstrerer beregning af tjeksum ved hjælp af SHA-256 for at oprette et møde.

Python 3

import hashlib
import urllib.parse
import requests

BBB_URL = "https://api-guide.bbbserver.com/bigbluebutton/api"
BBB_SECRET = "replace-with-secret"

def bbb_checksum(call_name: str, query_string: str) -> str:
    """Calculate the BBB API checksum (SHA-256)."""
    raw = call_name + query_string + BBB_SECRET
    return hashlib.sha256(raw.encode("utf-8")).hexdigest()

# Create a meeting
params = urllib.parse.urlencode({
    "name": "Demo",
    "meetingID": "replace-with-meeting-id",
    "attendeePW": "replace-with-password",
    "moderatorPW": "replace-with-password",
})
checksum = bbb_checksum("create", params)
response = requests.get(f"{BBB_URL}/create?{params}&checksum={checksum}")
print(response.text)

PHP

<?php
$bbbUrl    = "https://api-guide.bbbserver.com/bigbluebutton/api";
$bbbSecret = "replace-with-secret";

function bbbChecksum(string $callName, string $queryString, string $secret): string {
    return hash("sha256", $callName . $queryString . $secret);
}

// Create a meeting
$params = http_build_query([
    "name"        => "Demo",
    "meetingID"   => "replace-with-meeting-id",
    "attendeePW"  => "replace-with-password",
    "moderatorPW" => "replace-with-password",
]);
$checksum = bbbChecksum("create", $params, $bbbSecret);
$response = file_get_contents("{$bbbUrl}/create?{$params}&checksum={$checksum}");
echo $response;

JavaScript (Node.js)

const crypto = require("crypto");
const https = require("https");

const BBB_URL = "https://api-guide.bbbserver.com/bigbluebutton/api";
const BBB_SECRET = "replace-with-secret";

function bbbChecksum(callName, queryString) {
  return crypto
    .createHash("sha256")
    .update(callName + queryString + BBB_SECRET)
    .digest("hex");
}

// Create a meeting
const params = new URLSearchParams({
    name: "Demo",
    meetingID: "replace-with-meeting-id",
    attendeePW: "replace-with-password",
    moderatorPW: "replace-with-password",
}).toString();

const checksum = bbbChecksum("create", params);
https.get(`${BBB_URL}/create?${params}&checksum=${checksum}`, (res) => {
  let data = "";
  res.on("data", (chunk) => (data += chunk));
  res.on("end", () => console.log(data));
});

Java

import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;

public class BbbApi {
    static final String BBB_URL = "https://api-guide.bbbserver.com/bigbluebutton/api";
    static final String BBB_SECRET = "replace-with-secret";

    static String bbbChecksum(String callName, String queryString) throws Exception {
        String raw = callName + queryString + BBB_SECRET;
        MessageDigest digest = MessageDigest.getInstance("SHA-256");
        byte[] hash = digest.digest(raw.getBytes(StandardCharsets.UTF_8));
        StringBuilder hex = new StringBuilder();
        for (byte b : hash) hex.append(String.format("%02x", b));
        return hex.toString();
    }

    public static void main(String[] args) throws Exception {
        String params = "name=" + URLEncoder.encode("Demo", "UTF-8")
            + "&meetingID=replace-with-meeting-id"
            + "&attendeePW=replace-with-password"
            + "&moderatorPW=replace-with-password";
        String checksum = bbbChecksum("create", params);
        String url = BBB_URL + "/create?" + params + "&checksum=" + checksum;
        System.out.println(url);
    }
}

Ruby

require "digest"
require "uri"
require "net/http"

BBB_URL    = "https://api-guide.bbbserver.com/bigbluebutton/api"
BBB_SECRET = "replace-with-secret"

def bbb_checksum(call_name, query_string)
  Digest::SHA256.hexdigest(call_name + query_string + BBB_SECRET)
end

# Create a meeting
params = URI.encode_www_form(
    name: "Demo",
    meetingID: "replace-with-meeting-id",
    attendeePW: "replace-with-password",
    moderatorPW: "replace-with-password"
)
checksum = bbb_checksum("create", params)
uri = URI("#{BBB_URL}/create?#{params}&checksum=#{checksum}")
puts Net::HTTP.get(uri)

curl (Bash)

BBB_URL="https://api-guide.bbbserver.com/bigbluebutton/api"
BBB_SECRET="replace-with-secret"

CALL="create"
PARAMS="name=Demo&meetingID=replace-with-meeting-id&attendeePW=replace-with-password&moderatorPW=replace-with-password"
CHECKSUM=$(echo -n "${CALL}${PARAMS}${BBB_SECRET}" | sha256sum | awk '{print $1}')

curl -s "${BBB_URL}/${CALL}?${PARAMS}&checksum=${CHECKSUM}"

Fuldt eksempel: Opret og Deltag i et møde (curl)

#!/bin/bash
BBB_URL="https://api-guide.bbbserver.com/bigbluebutton/api"
BBB_SECRET="replace-with-secret"

bbb_checksum() {
  echo -n "${1}${2}${BBB_SECRET}" | sha256sum | awk '{print $1}'
}

# 1. Create a meeting
CREATE_PARAMS="name=Demo&meetingID=replace-with-meeting-id&attendeePW=replace-with-password&moderatorPW=replace-with-password"
CREATE_CS=$(bbb_checksum "create" "$CREATE_PARAMS")
curl -s "${BBB_URL}/create?${CREATE_PARAMS}&checksum=${CREATE_CS}"

# 2. Generate moderator join URL
JOIN_PARAMS="meetingID=replace-with-meeting-id&fullName=Admin&role=MODERATOR&redirect=true"
JOIN_CS=$(bbb_checksum "join" "$JOIN_PARAMS")
echo ""
echo "Moderator URL: ${BBB_URL}/join?${JOIN_PARAMS}&checksum=${JOIN_CS}"

# 3. Generate viewer join URL
JOIN_PARAMS2="meetingID=replace-with-meeting-id&fullName=Guest&role=VIEWER&redirect=true"
JOIN_CS2=$(bbb_checksum "join" "$JOIN_PARAMS2")
echo "Viewer URL: ${BBB_URL}/join?${JOIN_PARAMS2}&checksum=${JOIN_CS2}"

# 4. Check meeting status
INFO_CS=$(bbb_checksum "getMeetingInfo" "meetingID=replace-with-meeting-id")
curl -s "${BBB_URL}/getMeetingInfo?meetingID=replace-with-meeting-id&checksum=${INFO_CS}"

Ofte stillede spørgsmål

tjeksummen er en kryptografisk hash, der tilføjes til hver API-anmodning. Den beviser, at den kaldende part kender den delte hemmelighed uden at overføre selve hemmeligheden. Uden en gyldig tjeksum afviser BigBlueButton-serveren anmodningen.

Brug SHA-256 eller højere til alle nye implementeringer. SHA-1 understøttes af hensyn til bagudkompatibilitet, men anses for forældet. SHA-384 og SHA-512 er tilgængelige fra og med BigBlueButton 2.5.

Nej. tjeksummen beregnes udelukkende ud fra URL'ens query string. POST-bodyen (såsom præsentations-XML eller tilsidesættelser af klientindstillinger) indgår ikke i beregningen af tjeksummen.

Kør kommandoen bbb-conf --setsecret <new-secret> på din BigBlueButton-server. Efter ændring af hemmeligheden skal du straks opdatere alle integrerede applikationer, da den gamle hemmelighed ikke længere vil blive accepteret.

Ja. Rediger egenskaben supportedChecksumAlgorithms i /etc/bigbluebutton/bbb-web.properties, og fjern de algoritmer, du vil deaktivere. Hvis du deaktiverer SHA-256, skal du også opdatere indstillingen checkSumAlgorithmForBreakouts i bbb-apps-akka.conf.

Da tjeksummen inkluderer den delte hemmelighed som en del af inputtet til hash, vil enhver ændring af query-parametrene producere en anden hash. Serveren genberegner tjeksummen på sin side og afviser anmodningen, hvis værdierne ikke stemmer overens.

Nej. Mekanismen tjeksum inkluderer som standard ikke et tidsstempel eller en nonce. For at afbøde replay-angrebdeltag-URL'er skal du inkludere parameteren createTime fra det oprindelige create-svar. Dette knytter deltag-linket til en bestemt mødeinstans.