我是一个新的Windows 8开发人员,我有一些专为Linux设计的代码,但只要安装了GTK#,就可以在Windows上运行.
我目前正在将该应用程序移植到Windows 8作为Modern UI(Metro)应用程序.它很顺利,除了当我尝试导入我的密钥派生代码(它获取用户的密码并从中获取密钥256位密钥)时,Visual Studio Ultimate 2013表明它无法识别using System.Security.Cryptography.
在查看Windows 8开发人员网站后,我发现有一个新类Windows.Security.Cryptography,但是,它似乎也没有被Visual Studio识别.
所以,既然你有背景,我有几个问题:
为了澄清我想要做什么,我的密钥派生代码发布如下:
public class GetKey
{
// constructor
public GetKey (bool use=true, string password="none")
{ if (use == true)
{
this.genSalt();
byte[] salt = this.salt;
Rfc2898DeriveBytes pwdKey = new Rfc2898DeriveBytes(password, salt, 4000);
this.key = pwdKey.GetBytes(32);
this.iv = pwdKey.GetBytes(16);
}
}
// properties
private byte[] key;
private byte[] iv;
private byte[] salt;
// methods
public void retrieveKey(string password)
{
try
{ …Run Code Online (Sandbox Code Playgroud) 问题
我的应用程序(我将用 C# 编写)使用密钥推导方法(Rfc2898DeriveBytes,4000 次迭代)和盐来生成密码的“散列”。然后将此散列发送到数据库,以便用户将来可以使用该密码对其帐户进行身份验证。
到目前为止,这应该是安全的,但在那之后,我想在相同的密码上使用 Rfc2898DeriveBytes 来生成一个可以用于加密的密钥。现在我打算这样做的方法是使用相同方法的 5000 次迭代来获取不同的密钥,但我担心如果存储在数据库中的哈希值被泄露(或者我被迫透露它),它将是可能以某种方式导出第二个密钥。那可能吗?
潜在的解决方案
如果您有任何关于如何最好地改进此流程的建议,我将不胜感激。我会发布代码,但我还没有写。
我对开发相当陌生,并尝试使用 Blazor 学习 C# 开发。我目前正在学习如何使用 构建表单EditForms并使用 进行验证DataAnnotationsValidator。
在继续处理表单之前,我已经成功完成了验证所需的大部分工作,但是,我在验证的一个重要方面遇到了麻烦:我正在处理的表单是新用户的注册表单。通常,在注册新用户时,您可能希望让用户重新输入电子邮件地址或密码等值,以确保他们输入正确:
<InputText @bind-Value=User.email id="email" /><br />
<ValidationMessage For=@( () => User.email) />
<label for="confirm">Confirm Email</label><br />
<InputText @bind-Value=User.confirm id="confirm"/><br />
Run Code Online (Sandbox Code Playgroud)
为了验证这些字段,我有类 UserModel,我已将其实例化为 User()。
@code
{
UserModel User = new UserModel();
class UserModel
{
[Required]
[EmailAddress(ErrorMessage = "Please enter a valid email address.")]
public string email { get; set; }
[Required]
[EmailAddress(ErrorMessage = "Please confirm your email address.")]
[Compare(email, ErrorMessage = "The email addresses you entered did not match.")]
public …Run Code Online (Sandbox Code Playgroud) 我的问题是:
是不是以明文的形式存储盐就会失去盐的目的(我听说这样做很好)?我的印象是盐是一个额外的变量,为蛮力或字典攻击提供了额外的复杂性,通过导致任何尝试将正确的密码转换为密钥失败,除非提供了正确的盐.在我看来,如果盐已知,攻击者可以使用正确的盐尝试每个密码.如果没有,为什么?
提前感谢您抽出宝贵时间回答我的问题.
我一直试图在C#(aaaa,aaab,aaac,... abcd,abce)中依次为哈希破解者生成密码(用于白帽).但是,我不知道该怎么做.
现在我有一个char数组,其最后一个元素由一个开关递增:
switch (character) {
case ('0'):
character = '1';
break;
case ('1'):
character = '2';
break;
case ('2'):
character = '3';
break;
case ('3'):
character = '4';
break;
case ('4'):
character = '5';
break;
case ('5'):
character = '6';
break;
case ('6'):
character = '7';
break;
case ('7'):
character = '8';
break;
case ('8'):
character = '9';
break;
case ('9'):
character = 'a';
break;
case ('a'):
character = 'b';
break;
case ('b'):
character = 'c';
break;
case ('c'): …Run Code Online (Sandbox Code Playgroud) c# ×5
encryption ×3
hash ×2
security ×2
asp.net-core ×1
blazor ×1
regex ×1
salt ×1
windows-8 ×1