Wixzel Voice 的安全性
Wixzel Voice 會將電信業者密碼加密儲存、API 金鑰只以加了 pepper 的雜湊值儲存、簽署每個 webhook,並將 API 及其資料放在印度孟買。本頁列出程式碼目前實際執行的措施、尚未到位的項目,以及如何回報漏洞。
最後更新於
發布於
Wixzel Voice 是一個語音 AI API,用於打造 AI 代理,透過您自己的 SIP 中繼撥打和接聽真實的電話,或在您的網頁和行動應用程式中與人對話。一把 API 金鑰和一份預付餘額即可使用所有語音引擎,依實際用量按秒計費。 這表示它保管三樣值得保護的東西:您的電信業者憑證、會花費您餘額的金鑰,以及您的代理所進行通話的音訊、逐字稿和聯絡人。
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,成本參數 12 | API:帳號 |
| 資料存放位置 | 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 中繼密碼?
Wixzel Voice 看得到我的 API 金鑰嗎?
wv_live_ 前綴和最後四個字元,讓您能在清單中辨識金鑰;儲存的任何內容都無法還原金鑰。遺失的金鑰只能更換。如何驗證 webhook 確實來自 Wixzel Voice?
X-Wixzel-Signature 標頭比較。密鑰只會在您以 POST /v1/webhook/rotate-secret 輪替時顯示一次,GET /v1/webhook 從不傳回。Wixzel Voice 的資料存放在哪裡?
Wixzel Voice 有安全認證嗎?
如何回報 Wixzel Voice 的安全問題?
request_id。同一個地址也公布在 /.well-known/security.txt 中。
