我有一个函数GetPassword,它返回一个SecureString类型.
当我将此安全字符串传递Rfc2898DeriveBytes给生成密钥时,Visual Studio会显示错误.我有限的知识告诉我,这是因为Rfc2898DeriveBytes只接受一个字符串而不是一个安全的字符串.这有解决方法吗?
//read the password from terminal
Console.Write("Insert password");
securePwd = myCryptography.GetPassword();
//dont know why the salt is initialized like this
byte[] salt = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0xF1, 0xF0, 0xEE, 0x21, 0x22, 0x45 };
try
{ //PBKDF2 standard
Rfc2898DeriveBytes key = new Rfc2898DeriveBytes(securePwd, salt, iterationsPwd);
Run Code Online (Sandbox Code Playgroud) 我想使用DPAPI加密SecureString,以便将其保存到磁盘。
.net DPAPI类是ProtectedData类,但是ProtectedData.Protect具有单个重载,该重载采用字节数组。没有接受SecureString的重载。
在.NET app.config文件中的加密密码中,John Galloway通过首先将SecureString转换为不安全的字符串来利用上述重载。我想避免这种情况,因为它首先破坏了使用SecureString的目的。
该ConvertFrom-SecureString的 PowerShell命令似乎做我所需要的,因为“如果没有指定键,Windows数据保护API(DPAPI)用于加密标准字符串表示”但我不知道我怎么会使用此cmdlet直接从.net或即使这样做是一个好主意。
我有一个带有表单的HTML文件,一旦用户点击"提交",就会调用一个PHP文件,该文件连接到MySQL数据库并使用表单中的数据进行更新.
问题是,如何在PHP代码文件中屏蔽/隐藏MySQL数据库的密码?
我正在阅读有关使用"配置"文件和/或将事物移动到不同目录中的各种事情,以防止其他人访问它们 - 我理论上得到它 - 但我应该采取的实际步骤是什么实现这一目标?我喜欢从哪里开始?步骤#1是什么,步骤#2是什么?每个人似乎都提供了很少的代码片段,但我还没有找到任何好的从头到尾的教程.
我打电话给GoDaddy--我的帐户和数据库所在的位置 - 看看他们的技术支持人员是否可以提供帮助 - 没有人能够告诉我究竟要做什么,从哪里开始等等.
任何人都可以帮忙吗?
我有一个带扩展方法的.net框架4.7库,其中一个使用了一个securestring,但我想将这个库转换为.net Standard 1.6.但是,无法使用SecureString类型.
所以我想知道.net标准中是否有SecureString的替代品.
谢谢.
我在将以前存储的 SecureString 转换回其原始字符串时遇到问题。我这样做是因为我相信最初输入密码时可能存在拼写错误。
SecureString 最初是使用以下命令创建并存储在文本文件中的:
$SecurePassword = Read-Host -Prompt "Enter password" -AsSecureString
$SecurePassword | ConvertFrom-SecureString > C:\TEMP\TEST_Secure.txt
Run Code Online (Sandbox Code Playgroud)
对于我选择的应用程序(Veeam 备份),我读取包含加密密码的文件并将其反馈回应用程序
$SecurePasswordPath = "C:\TEMP\TEST_Secure.txt"
$EncryptionKey = cat $SecurePasswordPath | ConvertTo-SecureString
Run Code Online (Sandbox Code Playgroud)
Veeam备份脚本实际上是按如下方式读取的:
$EncryptionKey = Add-VBREncryptionKey -Password (cat $SecurePasswordPath | ConvertTo-SecureString)
Run Code Online (Sandbox Code Playgroud)
我已尝试以下方法来尝试恢复密钥:
$new1 = cat $SecurePasswordPath | ConvertTo-SecureString
$Ptr = [System.Runtime.InteropServices.Marshal]::SecureStringToCoTaskMemUnicode($new1)
$result = [System.Runtime.InteropServices.Marshal]::PtrToStringUni($Ptr)
[System.Runtime.InteropServices.Marshal]::ZeroFreeCoTaskMemUnicode($Ptr)
Run Code Online (Sandbox Code Playgroud)
结果通常是一个空白字段。
我也尝试过更推荐的方法:
$new1 = cat $SecurePasswordPath | ConvertTo-SecureString
[System.Runtime.InteropServices.marshal]::PtrToStringAuto([System.Runtime.InteropServices.marshal]::SecureStringToBSTR($new1))
Run Code Online (Sandbox Code Playgroud)
每一个结果都不会真正返回任何内容。
我担心我在创建时没有遵循正确的语法,并且无法恢复原始密钥,因此无法恢复我的备份。
到这里就绝望了!任何帮助将不胜感激!!
我想知道我是否采取了任何可能导致代码故障的隐含假设?
我想避免使用 Import-Clixml cmdlet 是有原因的吗?因此,我开发了一种替代方案,即一系列命令,旨在从使用 Export-Clixml 创建的 CliXml 文件中提取用户名和密码。它现在可以工作,但我不确定分割解决方案是否可靠。
$credFileUriBld = [UriBuilder]::New('file','localhost',-1,"MyCredentials.xml"))
$credFile = [Xml.XMLDocument]::New()
$nsMgr4ps1xml = [Xml.XmlNamespaceManager]::New($credFile.NameTable)
$nsMgr4ps1xml.AddNamespace('ps1xml','http://schemas.microsoft.com/powershell/2004/04')
$credFile.Load($credFileUriBld.Path)
$netCredInfo = [System.Net.NetworkCredential]::New($credFile.SelectSingleNode('/ps1xml:Objs/ps1xml:Obj/ps1xml:Props/ps1xml:S[@N=''UserName'']/text()',$nsMgr4ps1xml).Get_Value(),
($credFile.SelectSingleNode('/ps1xml:Objs/ps1xml:Obj/ps1xml:Props/ps1xml:SS[@N=''Password'']/text()',$nsMgr4ps1xml).Get_Value().Split('00') |
ForEach-Object { if([String]::IsNullOrEmpty($_)) { } else { $_.Trim() } } |
ForEach-Object { [convert]::ToInt32($_,16) } |
ForEach-Object { [convert]::ToChar($_) } |
ForEach-Object -Begin { $ss=[SecureString]::New() } -Process {$ss.AppendChar($_)} -End { $ss }))
$netCredInfo.UserName
$netCredInfo.Password
Run Code Online (Sandbox Code Playgroud)
您能否看一下并建议是否存在任何使代码不可靠的假设?
powershell credentials securestring networkcredentials powershell-core
为什么在地球上有人会在枚举字符之前将字符串转换为char []?初始化在网络周围找到的System.Security.SecureString的常规模式如下:
SecureString secureString = new SecureString();
foreach (char c in "fizzbuzz".ToCharArray())
{
secureString.AppendChar(c);
}
Run Code Online (Sandbox Code Playgroud)
调用ToCharArray()对我来说毫无意义.有人能告诉我这里是不是错了吗?
这样做有什么好处
char[] sec = { 'a', 'b', 'c'};
SecureString s = new SecureString();
foreach (char c in sec) {
s.AppendChar(c);
}
IntPtr pointerName = System.Runtime.InteropServices.Marshal.SecureStringToBSTR(s);
String secret = System.Runtime.InteropServices.Marshal.PtrToStringBSTR(pointerName);
Run Code Online (Sandbox Code Playgroud)
比这个
String secret = "abc";
Run Code Online (Sandbox Code Playgroud)
或这个
char[] sec = { 'a', 'b', 'c'};
String secret = new Secret(sec);
Run Code Online (Sandbox Code Playgroud)
如果我想保护"abc"免受在反编译的MSIL代码中检测到的影响?
是否可以使用System.Windows.Forms.TextBox(或任何其他方法)输入文本,然后将其转换为安全字符串?我希望能够获取输入的值,将其转换为安全字符串并将其写入一个文件,然后可以在需要时调用该文件,并且如果我们需要识别该值,则可以将安全字符串转换回来。
我研究过与此类似的内容,但由于我使用的是 TextBox 表单,所以我不想依赖 Read-Host
$secstr = Read-Host -AsSecureString "Enter your text"
$secstr | ConvertFrom-SecureString | out-file C:\temp\test.txt
$secstr = get-content c:\temp\test.txt | ConvertTo-SecureString -AsPlaintText -Force
Run Code Online (Sandbox Code Playgroud)
本质上,我想让一个文本框使用屏蔽/密码字符(我可以使用它$TextBox.PasswordChar = "*",然后获取该输入并将其转储到安全字符串文本文件中。然后,我可以使用另一个脚本来调用该文件并显示文本如果最终用户需要知道当前值,则以纯文本形式提供给他们。
我有一个应用程序从Windows窗体文本框中获取一个字符串,并将其传递给使用字符串作为参数的API.我看到任务完成后仍然可以从进程内存中查询字符串.我遇到过SecureString用于字符串内存管理功能的建议.但是,如果我理解正确,如果安全字符串是从字符串构建的,或者安全字符串的值最终存储在字符串中,则字符串的用途就会失败.
请建议什么是最好的解决方案.
securestring ×10
c# ×5
.net ×3
powershell ×3
string ×2
connection ×1
credentials ×1
cryptography ×1
enumeration ×1
memory-dump ×1
mysql ×1
pbkdf2 ×1
php ×1
security ×1