跳到主要內容
安全性

Wixzel Voice 的安全性

Wixzel Voice 會將電信業者密碼加密儲存、API 金鑰只以加了 pepper 的雜湊值儲存、簽署每個 webhook,並將 API 及其資料放在印度孟買。本頁列出程式碼目前實際執行的措施、尚未到位的項目,以及如何回報漏洞。

最後更新於

發布於

Wixzel Voice 是一個語音 AI API,用於打造 AI 代理,透過您自己的 SIP 中繼撥打和接聽真實的電話,或在您的網頁和行動應用程式中與人對話。一把 API 金鑰和一份預付餘額即可使用所有語音引擎,依實際用量按秒計費。 這表示它保管三樣值得保護的東西:您的電信業者憑證、會花費您餘額的金鑰,以及您的代理所進行通話的音訊、逐字稿和聯絡人。

Wixzel Voice 會加密、雜湊和簽署哪些資料?

Wixzel Voice 安全措施
項目內容來源
電信業者(SIP 中繼)密碼新設定和更新的值以 AES-256-GCM 搭配每個部署專屬的金鑰加密儲存;舊值會在下次儲存時重新加密;API 之後不會再傳回API:憑證加密
API 金鑰只顯示一次;只以搭配伺服器端 pepper 的 HMAC-SHA256 儲存;有權限範圍,沒有管理員權限範圍API:金鑰
MCP 連接器登入OAuth 2.1 授權碼流程,PKCE 僅接受 S256;權杖是一把有權限範圍、可撤銷的 API 金鑰文件:MCP 伺服器
Webhook已簽署:X-Wixzel-Signature 是原始內文的 HMAC-SHA256;指向私人網路的 URL 會被拒絕文件:Webhooks
涉及金額的路徑POST /v1/calls、POST /v1/agents/{id}/test-call 和 POST /v1/billing/topups 必須帶 Idempotency-Key;保留 24 小時API:冪等性
速率限制每把金鑰每秒 10 次請求,突發上限 20 次;登入和註冊依 IP 和電子郵件地址限流文件:速率限制
傳輸連到 API、主控台和 MCP 伺服器的 HTTPS 與 WebSocket 連線使用 TLS,並啟用為期一年、包含子網域的 HSTS。連到您電信業者的 SIP 使用中繼設定的傳輸方式(預設為 UDP,若有設定則為 TLS),通話音訊(RTP)未加密API:HTTP 強化、SIP 設定
帳號密碼bcrypt,成本參數 12API:帳號
資料存放位置Hostinger,印度孟買;主控台和網站在 Vercel 上隱私權政策
信用卡號碼永遠不會經過 Wixzel Voice;Dodo Payments 是登記商家(merchant of record)事實資料
回報漏洞aqeel@wixzel.com,與 /.well-known/security.txt 中列出的相同security.txt

Wixzel Voice 如何保護電信業者密碼?

Wixzel Voice 需要您的 SIP 中繼密碼才能透過您的電信業者撥打電話,因此無法將它雜湊,而是將它加密。新設定和更新的中繼密碼,以及平台代表客戶保管的所有其他第三方憑證,都以 AES-256-GCM 加密儲存。主金鑰是以 scrypt 從只存在於部署環境中的密鑰延展而來,每個值都透過 HKDF 取得自己的訊息金鑰,每段密文也都標記了寫入它的金鑰 id,因此未來輪替金鑰時可以重新包裝這些值,而不會遺失。以舊方式寫入的值仍可讀取,並會在下次儲存時以這種方式重新加密。

GCM 具有驗證機制:資料庫中被竄改的密文會解密失敗,而不會變成另一組密碼。無法解密的憑證會被明確拒絕,而不會被當成空值,因此中繼永遠不會在不知不覺中變成未驗證狀態。API 之後不會再傳回中繼密碼,包括對您本人。

根據您的中繼設定所產生的電話設定檔已針對注入攻擊加以強化,產生器也以模糊測試驗證這項特性。

Wixzel Voice 如何儲存 API 金鑰並限定其權限範圍?

wv_live_ 金鑰只會顯示一次。Wixzel Voice 儲存的是以伺服器端 pepper 為金鑰計算出的 HMAC-SHA256,因此光是取得資料庫副本,也無法還原或暴力破解金鑰。只保留前綴和最後四個字元,讓您能在清單中辨識金鑰。

  • 權限範圍。 每把金鑰只帶有您授予的權限範圍,例如 calls:read 或 sip_trunks:write。沒有管理員權限範圍,因此沒有任何金鑰能做所有事。
  • 花費上限。 金鑰可以設定 spend_limit_micros;金鑰花費達到上限後,以它撥打的電話會在撥號前被拒絕。
  • 到期與輪替。 金鑰可以設定 expires_at。POST /v1/api-keys/{id}/rotate 會發出替代金鑰,並讓舊金鑰繼續運作 24 小時,因此部署時永遠不會出現沒有有效金鑰的空窗。
  • 撤銷。 撤銷金鑰會立即將它從驗證快取中移除,因此下一個請求起就會失效。
  • 隔離。 每項資源都屬於一個帳號,每個查詢都限定在發出請求的帳號範圍內。

Wixzel Voice MCP 連接器如何登入?

claude.ai、Claude Desktop 和 Claude Code 等 AI 用戶端,透過 API 內建的 OAuth 2.1 授權伺服器連接 Wixzel Voice MCP 伺服器。用戶端會自行註冊(RFC 7591),將您導向主控台表示同意,再以授權碼交換權杖。PKCE 為必要項目,且僅接受 S256;plain 方法會被拒絕。

用戶端收到的權杖是一把一般的、有權限範圍的 API 金鑰,只帶有您核准的權限範圍,撤銷授權就會撤銷這把金鑰。OAuth 端點從不接受 API 金鑰作為憑證:用戶端以 PKCE 證明自己的身分,若註冊時取得了用戶端密鑰,也會一併使用。

Wixzel Voice 如何簽署 webhook?

每個 webhook POST 都帶有 X-Wixzel-Signature,這是以您的 webhook 密鑰對原始內文計算的 HMAC-SHA256。請在解析之前,針對原始位元組驗證,並以固定時間比較。密鑰只會在您輪替它時傳回一次,GET /v1/webhook 從不傳回,因此外洩的唯讀權限金鑰無法被用來偽造事件。

解析到迴路位址、鏈路本機位址或私人位址空間的 webhook URL,會在您設定時以 400 unsafe_webhook_url 拒絕,傳送時也會再次檢查,並且不會跟隨重新導向。平台能連到您連不到的位址,所以不會讓它被指向那些位址。

在 Wixzel Voice 上,什麼能防止重試造成重複收費?

POST /v1/calls、POST /v1/agents/{id}/test-call 和 POST /v1/billing/topups 都必須帶 Idempotency-Key。以相同金鑰和相同內文重送,會傳回原本的回應,而不會再次撥號或收費;相同金鑰搭配不同內文會以 422 拒絕。金鑰保留 24 小時。兩個官方 SDK 都會在這些路徑上自動送出。

撥打電話前會先預留點數,無法支付前 15 秒費用的通話會在分配任何資源之前以 402 拒絕,價格也會在每通通話受理時固定下來。信用卡號碼永遠不會經過 Wixzel Voice:付款透過登記商家 Dodo Payments 處理。

什麼能保護 Wixzel Voice 免於濫用?

  • API 速率限制: 每把金鑰每秒 10 次請求,突發上限 20 次。429 會帶有 Retry-After,且一律不收費。
  • 登入和註冊依 IP 位址和電子郵件地址限流;密碼以成本參數 12 的 bcrypt 雜湊,以電子郵件註冊時,會寄送驗證碼到該地址確認。
  • 主控台工作階段存放在 httpOnly cookie 中,從不放在 URL 裡;工作階段權杖的簽署演算法是固定的;您也可以一次登出所有工作階段。
  • 探測號碼的 SIP 掃描器會被暫時封鎖,每次來電嘗試也會在預留任何點數之前依來源位址限流,因此被拒絕的流量永遠不會向任何人收費。
  • 同時通話數依帳號設有上限,預設為 5 通,因此單一帳號無法佔用平台上的所有線路。
  • HTTP 強化:TLS 重新導向、為期一年且包含子網域的 HSTS、安全性標頭,以及明訂的請求內文大小上限。
  • 連到您電信業者的 SIP 使用中繼上設定的傳輸方式:預設為 UDP,若您設定了 transport,則為 TCP 或 TLS。通話音訊(RTP)未加密。

Wixzel Voice 將資料存放在哪裡,由誰處理?

Wixzel Voice API、其資料庫和通話媒體都在 Hostinger 位於印度孟買的伺服器上執行。主控台和本網站由 Vercel 提供。通話期間,代理所用引擎的語音與語言供應商(Deepgram、ElevenLabs、OpenRouter、Google 或 Sarvam)會處理音訊和文字;這些供應商位於美國,只有 Sarvam 在印度處理語音。

逐字稿,以及有錄音時的錄音,會與通話紀錄一起保存,直到您刪除為止;DELETE /v1/calls/{id} 會一併移除記錄、逐字稿和錄音,從主控台關閉帳號則會一次刪除其中的所有資料。請求記錄會在三個月後刪除。完整的子處理者清單,以及各自的角色與所在地,請見隱私權政策;資料處理附錄適用於每位客戶,並承諾在 72 小時內通知資料外洩事件。

Wixzel Voice 的資料如何備份?

兩個正式環境資料庫每小時都會傾印一次。每週的演練會將最新的傾印還原到臨時資料庫,並檢查每個帳號的餘額是否等於其帳本記錄的總和,因此可以確認備份確實可用,而不只是存在而已。

一個據實說明的限制:備份存放在同一台伺服器上,其他地方沒有副本。它們能應付有問題的部署、損壞的資料庫和誤刪的資料;但無法應付伺服器本身的損失。

Wixzel Voice 還有哪些措施尚未到位?

  • Wixzel Voice 由一個人營運;只有這位營運者能存取正式環境。
  • 沒有 SOC 2 報告,也沒有 ISO 27001 認證。
  • 送往電信業者的通話媒體未加密:通話音訊(RTP)不使用 SRTP 傳輸,SIP 信令則使用中繼的傳輸方式,除非您設定 TLS,否則為 UDP。
  • 沒有異地備份:備份與資料存放在同一台伺服器上。
  • 目前還無法透過 API 或主控台,將 API 金鑰限制為只能從特定來源 IP 位址使用。

如何回報 Wixzel Voice 的漏洞?

請寄信至 aqeel@wixzel.com。這個地址也公布在 /.well-known/security.txt 中。請附上您發現的問題、重現步驟,以及相關回應中的 request_id。訊息由營運者親自閱讀,大多會在一個工作天內回覆。

請只針對您自己的帳號和資料進行測試,不要影響其他客戶的服務品質,並在公開問題之前,給予合理的修正時間。

常見問題

Wixzel Voice 如何儲存我的 SIP 中繼密碼?

以 AES-256-GCM 加密儲存。新設定或更新的密碼會取得自己的訊息金鑰,該金鑰以 HKDF 從主金鑰衍生,而主金鑰本身則以 scrypt 從只由部署環境保管的密鑰延展而來;每段密文都帶有寫入時所用金鑰的 id。以舊方式儲存的值仍可讀取,並會在下次儲存時以這種方式重新加密。GCM 讓竄改變成解密失敗,而不會悄悄變成另一組密碼。API 之後不會再傳回密碼,包括對您本人。

Wixzel Voice 看得到我的 API 金鑰嗎?

看不到。金鑰只會在建立時顯示一次,儲存的只有以伺服器端 pepper 為金鑰計算出的 HMAC-SHA256。保留 wv_live_ 前綴和最後四個字元,讓您能在清單中辨識金鑰;儲存的任何內容都無法還原金鑰。遺失的金鑰只能更換。

如何驗證 webhook 確實來自 Wixzel Voice?

以您的 webhook 密鑰對原始請求內文計算 HMAC-SHA256,並以固定時間與 X-Wixzel-Signature 標頭比較。密鑰只會在您以 POST /v1/webhook/rotate-secret 輪替時顯示一次,GET /v1/webhook 從不傳回。

Wixzel Voice 的資料存放在哪裡?

API、資料庫和通話媒體在 Hostinger 位於印度孟買的伺服器上執行。位於美國和印度的語音與語言供應商會在通話期間處理音訊和文字,sarvam 引擎在印度處理語音。完整的子處理者清單請見隱私權政策。

Wixzel Voice 有安全認證嗎?

目前沒有。Wixzel Voice 由一位營運者經營;沒有 SOC 2 或 ISO 27001 報告。本頁列出程式碼實際執行的措施,資料處理附錄則列出各項承諾,包括在 72 小時內通知資料外洩事件。

如何回報 Wixzel Voice 的安全問題?

請寄信至 aqeel@wixzel.com,說明您發現的問題、重現方式,以及相關回應中的 request_id。同一個地址也公布在 /.well-known/security.txt 中。

相關內容

建立您的第一個語音代理