簡體   English   中英

如何在MySQL數據庫中存儲openssl_public_encrypt()輸出?

[英]How to store openssl_public_encrypt() output in MySQL database?

我需要從MySQL在MySQL中存儲一個加密但可恢復的(通過管理員)密碼。 AFAIK,最簡單的方法是使用openssl_public_encrypt(),但是我不確定需要哪種列類型。 我能否根據密鑰和輸入的大小對加密輸出的最大長度做出可靠的判斷?

還是我被迫使用一個巨大的字段(例如BLOB),只是希望它一直有效?

openssl_public_encrypt函數將可以加密的數據大小限制為密鑰的長度,如果使用填充(推薦),則會丟失額外的11個字節。

但是,OpenSSL使用的PKCS#1標准指定了一種填充方案(這樣您就可以加密較小的數量而不會丟失安全性),並且該填充方案至少占用11個字節(如果您要加密的值將更長)較小)。 因此,使用1024位密鑰可以加密的最大位數為936位(除非您通過添加OPENSSL_NO_PADDING標志來禁用填充,在這種情況下,最多可以增加1023-1024位)。 使用2048位密鑰,則改為1960位。

當然,您永遠不要禁用填充,因為這將使相同的密碼加密為相同的值。

因此,對於1024位密鑰,最大密碼輸入長度為117個字符。
對於2048位密鑰,則為245個字符。

我不確定輸出長度是否100%,但是可以通過簡單的跟蹤來確認,輸出是密鑰長度的簡單函數,因此對於2048位密鑰,我懷疑它是256個字節。

您應該使用具有所需長度的binary字符串來存儲密碼。
出於速度原因,最好在現場使用有限的長度索引。
不要使用blob(!),因為那樣會使事情減慢速度,而沒有任何好處。

CREATE TABLE user
  id unsigned integer auto_increment primary key,
  username varchar(50) not null,
  passRSA binary(256),      <<-- doublecheck the length.
  index ipass(passRSA(10))  <<-- only indexes the first 10 bytes for speed reasons. 
) ENGINE = InnoDB  

向索引添加額外的字節只會減慢速度並使索引文件增長而沒有任何好處。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM