使用PowerShell创建加密安全的伪随机数据
从Svendsen Tech PowerShell Wiki
跳到:导航, 搜索

Svendsen Tech's advanced PowerShell function New-RandomData can be used to generate both pseudorandom and cryptographically secure random data. The default is writing one or more ASCII encoded text files with \r\n line endings, but you can also use it to generate passwords, keys, and random numbers to store in a variable, etc., with the -RandomChar and/or -StreamToSTDOUT parameters. I will demonstrate its use.

应该适用于PowerShell版本2及更高版本。测试已使用PowerShell版本4完成。

New-RandomData-example-of-random-data.png


鸣叫



此图显示,在我(2009年份)系统上生成1 MiB大伪随机文件大约需要2.2秒。

New-RandomData-pseudorandom-example-1MB-verbose.png

此图显示,使用没有开销的默认随机字符集,在我(2009年份)系统上生成了1 MiB加密安全文件几乎花了24秒。

New-RandomData-cryptography-example-1MB-verbose.png

如果我们从2017年末开始快速升级到新计算机,并在Windows 10上运行PowerShell 5.1,则速度会好得多,如以下屏幕截图所示:

New-RandomData-example-new-2017-12-08.png

下载

新RandomData.ps1.txt -右键单击并下载,重命名,记得要取消阻止。点源(. .\New-RandomData.ps1),然后使用New-RandomData cmdlet。

RandomData.zip -模块版本。导出函数New-RandomData。下载,切记在解压缩之前进行解锁(在PSv3及更高版本中为Unblock-File),将包含模块文件的目录复制到PowerShell模块文件夹中。请参见$ Env:PSModulePath。也已发布到PowerShell画廊(请参见下文)。 四叶草头像

  • 2017年1月21日:上传模块版本1.2,该模块版本与现有脚本相同,除了已将其强制性脚手架指定为模块。我将其发布到PowerShell画廊以方便访问(请参见下文)。也将zip文件添加到Wiki。
    发布日期:2021年04月16日
         该死的

        继续她的跑步

        鲁弗说

        好像他们来到了一座坟墓

        洗完澡前一直穿着

         该死的

        我和安妮都被我们的那一刻所包裹

        当然

        仔细地嗅了一下伤口四叶草头像

        

        将他拉到了我们之间

        他不会允许她这样控制他

        我不适合你

        弄乱了我的粉蓝锈斑粉的钥匙

        
    音乐以其令人讨厌的刺耳的节奏沉入我的骨骼

  • 2016-03-12: Small optimizations. Generating two less random characters per line when writing a file, where \r\n will occupy two bytes, which means retrieving fewer random cryptography numbers, or fewer pseudorandom numbers, plus less appending to the string builder.
    • 在我的系统上,1 MiB文件的伪随机数据的速度从大约2.2秒缩短到1.5秒。密码学的区别并不是很明显。
  • 2016年2月18日:更改了字符串操作以使用System.Text.StringBuilder完成。对于1个MiB伪随机测试用例,将运行时间减少到不到一半-大约40 为1 MiB指定的-Cryptography速度提高了%。

早期版本:档案:New-RandomData.ps1.txt. 较早的模块版本:档案:RandomData.zip.

如果你有Windows管理框架5 或更高版本(WMF 5适用于Windows 7及更高版本),您可以从以下位置安装我的RandomData模块:PowerShell库,这是Microsoft网站和脚本在线存储库。

要使用WMF 5及更高版本进行安装(以获取可用的最新RandomData模块版本),只需运行以下命令(需要Internet连接):

安装模块-名称RandomData

或仅针对您的用户(无需海拔):

安装模块-名称RandomData -Scope CurrentUser

产生一个随机的100位数字

我们指定一个随机的char数组,其中包含0-9,大小和行长为100,然后我们就开始了。添加-StreamToSTDOUT并分配给变量。回想起来,我意识到这个例子有些奇怪。参见下面的密码生成。

将例如“ a-z”指定为-RandomChar或-RandomCharExclude的char数组的便捷方法是使用以下语法:-RandomChar ([char]’a’ .. [char]‘z’)

PS C:\dir> New-RandomData -Size 100 -LineLength 100 -Cryptography `
    -RandomChar ([char[]][string[]](0..9)) -Verbose
详细信息:随机字符数组:0、1、2、3、4、5、6、7、8、9
详细信息:随机字符数组大小:10
详细信息:将长度为10的数组完全复制25次,以尽可能接近字节大小的数组。
详细信息:复制后的随机char数组大小:250。
详细信息:生成不可用的密码号(开销)的可能性:2.34 %.
VERBOSE: Wrote 'C:\dir\random_file-1.txt'. 02/16/2016 23:45:51.
详细信息:必须获得101个密码。

PS C:\dir> gc .\random_file-1.txt
64922890229615691206867542730396091467023299366934980519254582563151943335669369766529859002962524

PS C:\dir> gc .\random_file-1.txt | %{ $_.Length } # \r\n take up 2 bytes
98

PS C:\dir> ls .\random_file-1.txt | ft -AutoSize length, name

长度名称
------ ----             
   100 random_file-1.txt

生成随机密码

这有简单的解决方案,但新RandomData完全可以被用来生成随机密码(或钥匙),如果指定-Cryptography参数甚至加密安全。

使用-StreamToSTDOUT参数并将大小和行长设置为相同的所需密码长度。

PS C:\> $RandomPassword = New-RandomData -Size 12 -LineLength 12 -StreamToSTDOUT

PS C:\> $RandomPassword
Fg7WWlKL0Wc1

You can also specify which characters to use for the password via the -RandomChar parameter. A convenient way to specify for instance "a-z" and "0-9" as a char array for either -RandomChar or -RandomCharExclude is using the syntax "-RandomChar ([char]'a' .. [char]'z' + [char]'0' .. [char]'9')".

加密安全的随机数据

参数-Cryptography启用使用加密安全的随机数生成器以索引到相等加权,可能重复,尽可能接近字节大小的随机字符数组的功能。这使用.NET System.Security.Cryptography随机数生成器 生成随机数以索引到数组中。

如果您不使用随机字符数组,通过该数组可以将256整除,那么会产生一些开销。 -Verbose参数(除其他事项外)将告诉您,潜在浪费地生成的不可用数字中的开销估计为一个百分比。

默认的随机字符集是a-z,A-Z,0-9,“-”和“ _”。这是64个字符,这意味着可以重复四次以完全适合256字节大小的数组,而不会造成开销。

PS C:\> New-RandomData -Size 1024 -LineLength 64 -StreamToSTDOUT `
    -密码学-详细
详细信息:随机字符数组:a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,
w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U, V,W,X,Y,Z,0、1
, 2, 3, 4, 5, 6, 7, 8, 9, -, _
详细信息:随机字符数组大小:64
详细信息:将长度为64的数组完全复制4次,以使字节大小的数组尽可能接近
尽可能地
详细信息:复制后的随机char数组大小:256。
详细信息:生成无法使用的密码数(开销)的可能性:0.00 %.
QJbSxK6GToqchRkMc9wkaIb35nuLTBMZpMX9OpI1QTGT5UkRJ4p8_Bbzp6braBcT
5dqfUcH8Q6_Vow2dqDNOSlluyxaoY5Pa4mdTMidJdFe1ttUNNxF7OtCypSJPksPt
rojkcVpCnWViwZVz3Ca6kTfx8Mh-Gazissr6OD9FGxXZFDoRrByXIbbk8gqWcabS
GjASgnvfjAo1fY3hP1HddRuR_Y8lKU_0T9Iqwk1EjvIhv9NwFPD5SiEYYziMTmds
_4VMXxdHNjmvdCwyaF-V2aE2n4sp01UOlsI3iJWD_aR0vnWn1a6NGbOhYudLK1rc
jNslYVyeXdn2uvzkPWSRLD2Xm1qhrb-MK_gZme0qNIU8K-zY6c0aFWDhRNyXYv7F
43RcFy7RZBZjnNZaFUz-oji7wC3_mQkvVySR1s8RDyTfaLZDJqulTvK0butX1d1D
MHMncSkaQwtO2zIS2PIC5KRQvQWLwW_ReqGUEfGfzDtshfGIhC7Th6WBojT6Redc
kH00UPZ8ILeZOtbHtwEzXwjdQGRF8hdlDFd2YFvcvpXGGEe6KyRXgTo8kKfogO6a
XMUGcTJJW5aILtACJ2nF1M55YU_E86Pd9ETm0sSqJJce7zMSceJU5E5NOKE8ayZB
KheXnhV9vqr2-cIG5W28Z2HwLzJtRGdbNsxTFNwEZKrE1zgjJHRozp0LT9ZffLsQ
sojF9ZlWzOrTyq9BVbS23zEFWBUot1YJ4tdB--oOhJNmnvbdlJ92eTeMiMTLOVBJ
82Ue2jEcyBv_-OcTsnSeoyRWwAx68cm3mJ0UwIptv7ZHVXGK2alHIb6PVdcAnQCP
qnYaucoDEFjlodGmO0zKo9B9AsvjuWdGQbJzlytefm0HmLVs1R31T5kaLB2vlIY8
qxoz5Q0awtI_18AKxczuCRVUvzHGi97wCyonx-ajT__ouEh2J9K08ZhhdJRNn78C
E_s1m6hL7lG6CX5FpJD1kw6KAvIvGSPTEVLKeu4opux6uro0psKxdk-8y_VSG4R7
详细信息:必须获取1024个密码。

PS C:\>  

生成1000个随机数据文件

-Count参数非常简单,它指定要创建的文件数,并添加了零填充数字。如果提供-RandomFileNameGUID开关参数,则GUID将附加到文件基本名称,默认情况下为“ random_file-”。扩展名(默认为.txt)会在结尾处抛出。

生成1000个大小为8192字节(8 KiB数据)的文件大约需要17-18秒。从2009年起仍在我的台式计算机上。

PS C:\temp\dir> Get-ChildItem

PS C:\temp\dir> . C:\Dropbox\PowerShell\New-RandomFile\New-RandomData.ps1

PS C:\temp\dir> Measure-Command { New-RandomData -Path (Get-Location) -Count 1000 `
  -Size 8192 -LineLength 256 } | % { 'Total seconds: ' + $_.TotalSeconds } 
总秒数:17.8322021

PS C:\temp\dir> (Get-ChildItem).count 
1000

PS C:\temp\dir> ls | select -first 3

    Directory: C:\temp\dir


模式LastWriteTime长度名称
----                -------------     ------ ----
-a --- 2016-03-26 01:52 8192 random_file-0001.txt
-a --- 2016-03-26 01:52 8192 random_file-0002.txt
-a --- 2016-03-26 01:52 8192 random_file-0003.txt


PS C:\temp\dir> ls | select -last 3

    Directory: C:\temp\dir


模式LastWriteTime长度名称
----                -------------     ------ ----
-a --- 2016-03-26 01:53 8192 random_file-0998.txt
-a --- 2016-03-26 01:53 8192 random_file-0999.txt
-a --- 2016-03-26 01:53 8192 random_file-1000.txt

PS C:\temp\dir> 

如果我们查看一个随机文件及其随机数据(最后一个替换将它每行分成64个字符),我们可以看到最后一行(长256个字符的行的末尾)比指定的行少2个字节256线路长度以腾出空间给文件中的回车和换行。使用-StreamToSTDOUT,不会发生这种情况。

PS C:\temp\dir> gc .\random_file-0888.txt | select -first 1 | 
    %{ $_ -replace '(.{64}(?!$))', "`${1}`n" }
Zop6BY37rt9YJxpl_eaHC0AMNoFNKyO4V1hNO0UDbdbmgVL9N4Me_j5_ZPsnspw4
QedUpOIlwIFyYnG4PIaRXK5M7iZ_HHkYSjHbS2U_vAUCPGmLiAJWpRhglCYg0JQ0
yTSPSElZ0avw2C8B8n2h9AIbbB1pdNkXW5e8ZJ5QoW7ovWqVGxkMTI39kQNrP7Vm
2JL8x_Nyum5nFuSrkgVSDJeobhYi7OasaUxXktyHVXsHPQD1-vgImdUsFx6pmE

参量

这些是New-RandomData的参数。

四叶草头像 四叶草头像
路径 目录存储在随机文件,默认为当前工作目录($ Pwd.Path)。使用“(GET-位置)”为当前目录,而不是“”,因为默认为cmdlet的内部配置文件目录。
基本名 如果生成一个文件,则为文件名加1加上扩展名。如果生成多个文件,则它是文件的基本名称加上可能为零的计数值。如果指定-RandomFileNameGUID,则会将GUID附加到该基本名称而不是计数编号,从而使该文件名也是伪随机的。默认值为“ random_file-”。
延期 用于生成文件的扩展名。
计数 要生成的文件数。预设值为1。
尺寸 文件大小(以字节为单位)。默认值1024B。如果指定的行长度不能被大小整除,则大小可以相差+/- 1个字节。
线长 Number of bytes per line, including \r\n if writing a file. If you specify a line length which the specified size is not evenly divisible by, the size can be off by +/- 1 byte. LineLength cannot be greater than the specified size.
NoClobber 不要覆盖具有相同名称的现有文件。
随机字符 Random char array of chars to use for generating the pseudorandom or cryptographically secure random data. Default: [A-Za-z0-9_-]. 64 characters. Fits perfectly in a 256 byte-sized array when repeated four times, making it as efficient as possible when generating cryptographically secure data, while preserving equal weighting of characters.
随机字符排除 从默认字符集(或提供的字符集中)中排除的字符。
NoRandomData Use fsutil and generate a file filled with zero bytes (`0 or \0) extremely fast. NB! No random data with this option.
RandomFileNameGUID 将GUID附加到文件基本名称,使文件名(也)为伪随机。
密码学 使用加密安全的随机数生成器从char数组中选择随机数据,而不是伪随机数生成器。
四叶草头像 StreamToSTDOUT 不要写任何文件,而是将随机数据流传输到STDOUT。