【发布时间】:2019-10-10 20:25:12
【问题描述】:
我需要为哈希运算生成盐值。
在数据库中生成这些盐值非常适合我的情况 - 在其他地方(例如客户端)生成这些盐值会更加复杂(并且容易出错/安全风险)
为了方便我自己,我编写了一些程序来生成各种类型的随机数。 (BIGINT、INT等)
显然,可以轻松修改这些过程以生成任意大小的随机字节块,但 BIGINT 是我现在的重点。
我遇到的问题是CRYPT_GEN_RANDOM 只能在非本地上下文中使用。
我有需要使用随机数的本地和非本地操作,它们都需要安全。
我现在的解决方法是在本机版本中使用NEWID(参见下面的代码),但众所周知这是不安全的,如果可能的话我想避免它。
有没有办法在本机程序中生成加密随机数?
--non-native, cryptographic
CREATE PROCEDURE [dbo].[RandomBigInt]
@result BIGINT OUTPUT
AS BEGIN
SET @result = CAST ( CRYPT_GEN_RANDOM ( 8 ) AS BIGINT ) ;
END
GO
--native, non-cryptographic
CREATE PROCEDURE [dbo].[NativeRandomBigInt]
@result BIGINT OUTPUT
WITH NATIVE_COMPILATION ,
SCHEMABINDING
AS BEGIN ATOMIC WITH ( TRANSACTION ISOLATION LEVEL = SNAPSHOT ,
LANGUAGE = N'English' )
SET @result = CAST ( CAST ( NEWID ( ) AS BINARY ( 8 ) ) AS BIGINT ) ;
END
GO
【问题讨论】:
-
您能否详细说明
all need to be secure的含义。 -
@Alex 我有多个 T-SQL 操作,一些是本机的,一些是非本机的,每个都有多组过程,需要生成随机数,并且它们都需要随机数来保证密码安全。常规的伪随机数(例如
NEWID)会导致安全问题(例如在对哈希进行加盐时)。 -
除非您是密码学专业人士,否则您想出的任何东西都不会是密码学安全的。鉴于您在这里问这个问题,那么您不是密码学专业人士。很抱歉给您带来坏消息。你能做的最好的可能是@Shnugo 建议的那样,尽可能多地组合不同的伪随机源。
-
@rossum 编写我自己的存储过程来实现 AES/SHA3 操作的原始加密算法算不算是加密专家?半职业选手?大声笑这不是我的第一个牛仔竞技表演,如果我必须编写自己的自定义本地编译的加密 rng,我可以 - 我真的不想(实际上我认为我已经在某处写了大部分代码,我应该搜索我的图书馆)。 (如果可以避免的话,滚动自己的加密货币通常也是一种不好的做法——我相信你知道。)
-
我对 MS 产品一无所知,但
NEWID似乎是一个 GUID。从密码学的角度来看,使用如此确定的东西似乎很糟糕(给定来自同一台机器的时间和盐值,只有大约 30 位的随机状态)。我会尝试拥有 128 或 256 位的随机性,因此这永远不是系统中的“最薄弱环节”。我有类似的经历,我会称自己为业余爱好者,我想说专业人士是设计加密系统并让他们经受住几年坚决攻击的人
标签: sql sql-server tsql random sql-server-2017