为什么.NET 的 RandomNumberGenerator.GetBytes 方法将其结果分配给一个字节数组参数而不是返回一个新的字节数组?
Why does .NET's RandomNumberGenerator.GetBytes method assign its results to a byte array parameter instead of returning a new byte array?
.NET Framework 具有 RandomNumberGenerator
class for generating cryptographically-secure random bytes. One of its main methods, GetBytes
,具有签名 void GetBytes (byte[] data)
- 它采用字节数组作为参数并用随机字节填充它,而不是返回字节数组。为什么是这样?在现有阵列上操作而不是创建新阵列是否出于安全原因?
我认为安全性并不是托管框架中 byte[]
参数的真正原因。我看不出它是由方法生成的和在方法之外生成的有什么区别,因为 byte[]
- 一个基本类型的数组 - 不太可能有多个实现。如果可能存在差异,那么让该方法生成字节数组会更有意义。
没有它,已经给出的效率原因更有意义;毕竟字节数组可能很大(-ish),并且您无法复制获取字节的调用的效率。还有另一种方法 that additionally takes an offset and "count" of bytes 到现有数组。这使您可以直接向数组生成字节,该数组还可以保存其他数据(例如,字节数组中 IV 和密文的串联)。当然,单个参数只是该调用的特例/便捷方法。多参数是效率最重要的参数,否则您还必须复制密文;毕竟数组不能收缩。创建同名但方法签名截然不同的方法会很奇怪。
其他框架,例如 Java JCA,对 SecureRandom
也有相同的方法。因此,除非有足够的理由进行更改,否则作者很可能知道此类框架并决定模仿这些现有的 API。
.NET Framework 具有 RandomNumberGenerator
class for generating cryptographically-secure random bytes. One of its main methods, GetBytes
,具有签名 void GetBytes (byte[] data)
- 它采用字节数组作为参数并用随机字节填充它,而不是返回字节数组。为什么是这样?在现有阵列上操作而不是创建新阵列是否出于安全原因?
我认为安全性并不是托管框架中 byte[]
参数的真正原因。我看不出它是由方法生成的和在方法之外生成的有什么区别,因为 byte[]
- 一个基本类型的数组 - 不太可能有多个实现。如果可能存在差异,那么让该方法生成字节数组会更有意义。
没有它,已经给出的效率原因更有意义;毕竟字节数组可能很大(-ish),并且您无法复制获取字节的调用的效率。还有另一种方法 that additionally takes an offset and "count" of bytes 到现有数组。这使您可以直接向数组生成字节,该数组还可以保存其他数据(例如,字节数组中 IV 和密文的串联)。当然,单个参数只是该调用的特例/便捷方法。多参数是效率最重要的参数,否则您还必须复制密文;毕竟数组不能收缩。创建同名但方法签名截然不同的方法会很奇怪。
其他框架,例如 Java JCA,对 SecureRandom
也有相同的方法。因此,除非有足够的理由进行更改,否则作者很可能知道此类框架并决定模仿这些现有的 API。