【问题标题】:How to generate a RNGCryptoServiceProvider-like number in TSQL如何在 SQL 中生成类似 RNGCryptoServiceProvider 的数字
【发布时间】:2009-10-05 19:09:42
【问题描述】:

有谁知道在 T-SQL 中生成类似 RNGCryptoServiceProvider 的随机数而无需注册任何 .NET 程序集的方法?

【问题讨论】:

    标签: sql sql-server tsql random


    【解决方案1】:

    SELECT CHECKSUM(NEWID()) 为您提供基于 GUID 的 32 位有符号整数。您可以以此为基础:这几乎是最好的 SQL 方式

    您可以使用它来播种 RAND(因为 RAND 对于单个选择中的所有行都是相同的。

    SELECT RAND(CHECKSUM(NEWID()))
    

    有符号的 64 位整数:

    SELECT CAST(CHECKSUM(NEWID()) as bigint) * CAST(CHECKSUM(NEWID()) as bigint)
    

    通过一些玩耍,您可以强制转换和/或连接以获得 binary("multiples of 4") 等来构建一个字节数组......虽然我没有使用 RAND 东西直接模仿

    【讨论】:

    • 这满足了我们的需求,因为加密随机性不是目标;真正的目标是获得大的随机数。谢谢。
    【解决方案2】:

    如果您必须生成cryptographycally secure random numbers(例如用于散列的盐),那么您应该使用 CLR 函数。校验和、guid 等对于加密操作并不安全。

    最简单的解决方案是使用调用 RNGCryptoServiceProvider 的CLR scalar function

    请注意,许多 SQL Server crpto 函数(如 EncryptByKey)已经使用加密安全生成的盐对输入进行加盐(除了 RC4 算法上的 EncryptByKey,它在 SQL 中被破坏)。

    【讨论】:

      猜你喜欢
      • 2013-10-18
      • 2020-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-14
      • 2011-09-12
      相关资源
      最近更新 更多