Bölüm 2

Checksum ve Kimlik Dogrulama

Her BigBlueButton API çağrısı, sunucunun shared secret değerinden hesaplanan bir checksum içermelidir. Bu mekanizma yetkisiz erişimi önler ve API isteklerini kurcalanmaya karşı korur.

Nasıl Çalışır

BBB API, bir shared-secret modelini kullanır: hem sunucu hem de çağıran uygulama aynı gizli anahtarı bilir. Gizli anahtar asla doğrudan iletilmez — bunun yerine her isteğe checksum parametresi olarak eklenen kriptografik bir hash girdisi olarak kullanılır.

shared secret son kullanıcılara asla ifşa edilmemelidir. Yalnızca entegrasyonu yapan uygulamanın sunucu tarafı yapılandırmasında yer almalıdır. Asla JavaScript, mobil uygulamalar veya başka herhangi bir istemci tarafı koda gömmeyin.

Shared Secret Değerini Alma

Gizli anahtar BigBlueButton sunucusunda /etc/bigbluebutton/bbb-web.properties içinde securitySalt özelliği olarak saklanır. Aşağıdaki komutu sunucuda çalıştırarak alabilirsiniz:

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

Örnek çıktı:

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

Checksum Hesaplama (Adım Adım)

Aşağıdaki örnek, SHA-256 kullanarak bir create API çağrısı için checksum değerinin nasıl hesaplanacağını gösterir.

oluşturun — checksum dışındaki tüm parametreleri birleştirin:

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

API method name değerini başına ekleyin (ayırıcı olmadan):

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

shared secret değerini sonuna ekleyin (ayırıcı olmadan):

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

Seçilen algoritmayı kullanarak hash hesaplayın (bu örnekte SHA-256):

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

checksum değerini query string sonuna checksum parametresi olarak ekleyin:

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

Desteklenen Hash Algoritmaları

BigBlueButton, checksum hesaplaması için çeşitli hash algoritmalarını destekler. Aşağıdaki tablo mevcut tüm seçenekleri listeler:

Algoritma Şu Sürümden Beri Mevcut Hash Uzunluğu
SHA-1 Tüm sürümler 40 karakter
SHA-256 BBB 2.4 64 karakter
SHA-384 BBB 2.5 96 karakter
SHA-512 BBB 2.5 128 karakter

Desteklenen algoritmalar sunucu tarafında /etc/bigbluebutton/bbb-web.properties içinde yapılandırılır:

supportedChecksumAlgorithms=sha256,sha384,sha512

Bir algoritmanın bu listeden kaldırılması, sunucuda devre dışı bırakılmasına neden olur. Varsayılan olarak dört algoritmanın tamamı etkindir.

SHA-1 artık kullanımdan kaldırılmış kabul edilir. Yeni uygulamalar için SHA-256 veya daha üstünü kullanın. Yalnızca eski entegrasyonlarla geriye dönük uyumluluğa ihtiyacınız varsa SHA-1 etkin bırakın.

POST İstekleri

BigBlueButton API'sine POST istekleri yaparken aşağıdaki kuralları göz önünde bulundurun:

  • checksum yalnızca URL query string üzerinden hesaplanır.
  • POST gövdesi (ör. sunum XML'i veya clientSettingsOverride), checksum hesaplamasına dahil edilmez.
  • checksum parçası olması gereken tüm parametreler query string içine yerleştirilmelidir.

Breakout Room Yapılandırması

SHA-256 desteğini devre dışı bırakırsanız, grup odalarının düzgün çalışmaya devam etmesini sağlamak için checkSumAlgorithmForBreakouts içindeki /etc/bigbluebutton/bbb-apps-akka.conf ayarını da güncellemeniz gerekir.

Güvenlik için En İyi Uygulamalar

  • shared secret değerini yalnızca sunucu tarafında saklayın — asla JavaScript'te, mobil uygulamalarda veya diğer istemci tarafı bağlamlarda saklamayın.
  • İletim sırasında checksum ve parametreleri korumak için her zaman HTTPS kullanın.
  • secret değerinin ele geçirildiğinden şüpheleniyorsanız, bunu bbb-conf --setsecret <new-secret> kullanarak derhal değiştirin.
  • checksum mekanizması kurcalamaya karşı koruma sağlar, ancak replay attacks saldırılarına karşı koruma sağlamaz. join URL'leri için, geçerlilik süresini sınırlamak amacıyla createTime parametresini kullanmayı değerlendirin.

Kullanıcılar için join bağlantıları oluştururken, özgün createTime yanıtındaki create parametresini ekleyin. Bu, katılım bağlantısının yalnızca o belirli toplantı örneği için geçerli olmasını sağlar.

Kod Örnekleri

Aşağıdaki örnekler, bir toplantı oluşturmak için SHA-256 kullanılarak checksum hesaplamasını göstermektedir.

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}"

Tam Örnek: Bir Toplantı Oluşturma ve Katılma (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}"

Sıkça Sorulan Sorular

checksum, her API isteğine eklenen kriptografik bir hash değeridir. Bu, gizli anahtarın kendisini iletmeden çağıranın shared secret değerini bildiğini kanıtlar. Geçerli bir checksum olmadan BigBlueButton sunucusu isteği reddeder.

Tüm yeni uygulamalarda SHA-256 veya daha üstünü kullanın. SHA-1 geriye dönük uyumluluk için desteklenir, ancak kullanımdan kaldırılmış kabul edilir. SHA-384 ve SHA-512, BigBlueButton 2.5 ile birlikte kullanılabilir.

Hayır. checksum yalnızca URL query string içeriğinden hesaplanır. POST gövdesi (örneğin presentation XML veya client settings overrides) checksum hesaplamasına dahil edilmez.

BigBlueButton sunucunuzda bbb-conf --setsecret <new-secret> komutunu çalıştırın. Gizli anahtarı değiştirdikten sonra tüm entegre uygulamaları hemen güncelleyin; çünkü eski gizli anahtar artık kabul edilmeyecektir.

Evet. supportedChecksumAlgorithms içindeki /etc/bigbluebutton/bbb-web.properties özelliğini düzenleyin ve devre dışı bırakmak istediğiniz algoritmaları kaldırın. SHA-256 desteğini devre dışı bırakırsanız, checkSumAlgorithmForBreakouts içindeki bbb-apps-akka.conf ayarını da güncelleyin.

checksum, hash girdisinin bir parçası olarak shared secret değerini içerdiğinden, query parametrelerinde yapılacak herhangi bir değişiklik farklı bir hash üretecektir. Sunucu kendi tarafında checksum değerini yeniden hesaplar ve değerler eşleşmezse isteği reddeder.

Hayır. checksum mekanizması varsayılan olarak bir zaman damgası veya nonce içermez. join URL'lerinde replay attacks saldırılarını azaltmak için, orijinal createTime yanıtındaki create parametresini dahil edin. Bu, join bağlantısını belirli bir toplantı örneğine bağlar.