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 Hvis du bruger bbbserver.de, kan du finde din API-URL og
shared secret i serverdashboardet under sektionen API-indstillinger. Der er ingen grund til at køre kommandolinjeværktøjer.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.
checksum:
name=Demo&meetingID=replace-with-meeting-id&attendeePW=replace-with-password&moderatorPW=replace-with-passwordPrepend API-metodenavnet (uden nogen separator):
createname=Demo&meetingID=replace-with-meeting-id&attendeePW=replace-with-password&moderatorPW=replace-with-passwordTilføj shared secret til sidst (uden nogen separator):
createname=Demo&meetingID=replace-with-meeting-id&attendeePW=replace-with-password&moderatorPW=replace-with-passwordreplace-with-secretBeregn hash ved hjælp af den valgte algoritme (SHA-256 i dette eksempel):
SHA-1: 7030bd96ede6a7ac41da848fe3bfc562e52a5914
SHA-256: 7e5a0a48f1542462e56ca034dc83d741bff1deb5feab0cd9ef74fa6e009fe1fdTilføj checksum til query-strengen som parameteren checksum:
name=Demo&meetingID=replace-with-meeting-id&attendeePW=replace-with-password&moderatorPW=replace-with-password&checksum=7e5a0a48f1542462e56ca034dc83d741bff1deb5feab0cd9ef74fa6e009fe1fdUnderstø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:
checksumberegnes udelukkende ud fra URL-query-strengen.POST-body'en (f.eks. præsentations-XML ellerclientSettingsOverride) er ikke inkluderet i beregningen afchecksum.- Alle parametre, der skal være en del af
checksum, skal placeres iquery-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 hemmelighedpå serversiden — aldrig i JavaScript, mobilapps eller andre klient-sidekontekster. - Brug altid HTTPS for at beskytte
tjeksummenog parametrene under overførsel. - Hvis du har mistanke om, at
hemmelighedener blevet kompromitteret, skal du straks rotere den ved hjælp afbbb-conf --setsecret <new-secret>. - Mekanismen
tjeksumbeskytter mod manipulation, men ikke modreplay-angreb. Forjoin-URL'er bør du overveje at bruge parameterencreateTimefor 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.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.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.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.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.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.tjeksum inkluderer som standard ikke et tidsstempel eller en nonce. For at afbøde replay-angreb på deltag-URL'er skal du inkludere parameteren createTime fra det oprindelige create-svar. Dette knytter deltag-linket til en bestemt mødeinstans.