Din*_*inu 8 sql database cryptography
我一直处于这种困境中一段时间,但是找不到任何提示,尽管似乎有人已经做到了。
我需要的是用加密的安全(即非连续!)ID替换顺序的AUTO_INCREMENT(或等效的)主键,但与此同时,我想保留顺序PK的性能优势:保证未使用的下一个ID,可集群性等。
一种简单的方法似乎实现了一种加密伪随机排列生成器,以将2 ^ N空间唯一地映射到2 ^ N,而不会发生冲突并且具有初始化矢量(IV)。
尽管可以在外部实现,但这确实需要存储和原子访问状态(排列位置或最后一个ID),这意味着从外部实现效率极低(这相当于UPDATE table SET crypto_id = FN_CRYPTO(autoincrement_id) WHERE autoincrement_id=LAST_INSERT_ID()
为每个都运行后续操作INSERT
)。
您是否知道在商业用途的数据库中有上述任何上述实现?
虽然这可以在外部实现,但这确实需要存储和原子访问状态(排列位置或最后一个 id),这意味着在外部实现效率非常低(相当于运行后续的
Run Code Online (Sandbox Code Playgroud)UPDATE table SET crypto_id = FN_CRYPTO(autoincrement_id) WHERE autoincrement_id=LAST_INSERT_ID()
您可以使用生成/虚拟列来避免为每个插入运行建议的更新:
-- pseudocode
CREATE TABLE tab(
autoincrement_id INT AUTO_INCREMENT,
crypto_id <type> GENERATED ALWAYS AS (FN_CRYPTO(autoincrement_id)) STORED
);
-- SQL Server example, SHA function is an example and should be replaced
CREATE TABLE tab(
autoincrement_id INT IDENTITY(1,1),
crypto_id AS (HASHBYTES('SHA2_256',CAST(autoincrement_id AS NVARCHAR(MAX)))) PERSISTED
);
Run Code Online (Sandbox Code Playgroud)
更多信息:
迪努编辑
如果您使用 SHA,请不要忘记将秘密盐连接到autoincrement_id
; 或者,您可以使用 AES128 使用autoincrement_id
秘密密码和 IV 进行加密。
另外值得注意的是:任何有权访问表 DDL 的数据库用户都将有权访问您的秘密 salt/key/iv。如果您担心这一点,您可以使用参数化存储过程 ieFN_CRYPTO(id,key,iv)
来代替,并将它们与每次插入一起发送。
要在应用程序端检索crypto_id
,而不需要后续查询,您需要复制应用程序端的加密函数以在返回的autoincrement_id
. 注意:如果用作autoincrement_id
AES128 的字节数组,请非常小心字节顺序,它可能会在数据库端和应用程序端有所不同。唯一的选择是使用OUTPUT
mssql 语法,但这是特定于 mssql 的,并且需要运行ExecuteScalar
API 而不是ExecuteNonQuery
.
归档时间: |
|
查看次数: |
246 次 |
最近记录: |