[英]Is there a reason why not to store encrypted data as binary in a database?
我必須將 AES-GCM 加密數據存儲在數據庫中。 目前我們使用 MariaDB,但可以選擇稍后更改為 PostgreSQL。 (但也應考慮其他數據庫)
既然算法實際上加密的不是字符串,而是字節,一個加密算法的output也是一個byte[],為什么不把加密后的數據直接存入二進制列呢?
對於 MariaDB/MySql 這將是一個BLOB
。 我了解 PostgreSQL 甚至有一個用於加密數據的首選特殊數據類型,稱為bytea
。
然而,大多數程序員似乎將加密字節編碼為 Base64 並將結果字符串存儲在VARCHAR
中。
Base64 的編碼和解碼對我來說似乎與直覺相反。 它使數據最多延長 50%,並且每次都是一個額外的步驟。 它還強制數據庫在存儲和檢索數據時應用字符編碼。 這是一個額外的步驟,肯定會花費額外的時間和資源,而我們真正需要存儲的只是一些字節。 加密數據在任何字符編碼中都毫無意義。
問題:
是否有充分的理由支持或反對將加密數據作為二進制存儲在數據庫中? 是否存在安全性、數據完整性或性能方面的原因,我可能不想將加密數據直接存儲為二進制文件?
(我認為這個問題很快就會被關閉為“基於意見” - 但盡管如此)
是否有充分的理由支持或反對將加密數據作為二進制存儲在數據庫中
不。我看不出有任何理由反對使用正確的“blob”類型( BLOB
, bytea
, varbinary(max)
,....)
一般的經驗法則是:使用與數據匹配的數據類型。 所以BLOB
(或等效類型)是正確的選擇。
使用 base64 編碼字符串可能是合理的,因為並非所有庫(像 ORM 之類的混淆層)都能夠正確處理“blob”,因此人們選擇使用普遍適用的東西(忽略存儲和處理的開銷)。
請注意,Postgres 的bytea
不是“加密數據的特殊類型”。 它是二進制數據(圖像、文檔、音樂……)的通用數據類型
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.