小编Raz*_*ick的帖子

System.Security.Cryptography与Windows.Security.Cryptography

我是一个新的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识别.

所以,既然你有背景,我有几个问题:

  1. System.Security.Cryptography在Windows 8中可用吗?如果是这样,是否支持RT版本?如何让Visual Studio识别它?
  2. Windows.System.Security是如何不同的,是否有与Rfc2898DeriveBytes兼容的类/方法?通过兼容,我的意思是给出相同的密码和盐是有一种方法来获得相同的密钥作为结果.

为了澄清我想要做什么,我的密钥派生代码发布如下:

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# encryption windows-8

12
推荐指数
2
解决办法
1万
查看次数

从一个密码派生多个密钥是否安全?

问题

我的应用程序(我将用 C# 编写)使用密钥推导方法(Rfc2898DeriveBytes,4000 次迭代)和盐来生成密码的“散列”。然后将此散列发送到数据库,以便用户将来可以使用该密码对其帐户进行身份验证。

到目前为止,这应该是安全的,但在那之后,我想在相同的密码上使用 Rfc2898DeriveBytes 来生成一个可以用于加密的密钥。现在我打算这样做的方法是使用相同方法的 5000 次迭代来获取不同的密钥,但我担心如果存储在数据库中的哈希值被泄露(或者我被迫透露它),它将是可能以某种方式导出第二个密钥。那可能吗?

潜在的解决方案

  • 理想情况下,我想使用相同的盐,但使用不同的盐会解决问题吗?
  • 将 SHA 用于数据库散列和 Rfc 用于加密密钥怎么样?
  • 在派生密钥之前将唯一但硬编码的字符串(分别如“网站”和“加密”)附加到每个字符串。(Damien_the_Unbeliever)
  • 生成双倍长度的密钥,并将派生密钥的前半部分用于认证,后半部分用于加密。(埃里克森)

如果您有任何关于如何最好地改进此流程的建议,我将不胜感激。我会发布代码,但我还没有写。

c# security encryption hash

6
推荐指数
1
解决办法
984
查看次数

如何使用 Blazor 中的 DataAnnotationsValidator 验证两个字段是否匹配?

我对开发相当陌生,并尝试使用 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# asp.net-core blazor

6
推荐指数
1
解决办法
3239
查看次数

将Salt作为明文存储在包含Cryptotext的文件中

我的问题是:

是不是以明文的形式存储盐就会失去盐的目的(我听说这样做很好)?我的印象是盐是一个额外的变量,为蛮力或字典攻击提供了额外的复杂性,通过导致任何尝试将正确的密码转换为密钥失败,除非提供了正确的盐.在我看来,如果盐已知,攻击者可以使用正确的盐尝试每个密码.如果没有,为什么?

提前感谢您抽出宝贵时间回答我的问题.

c# regex security encryption salt

3
推荐指数
1
解决办法
294
查看次数

在C#中生成顺序密码

我一直试图在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# hash switch-statement

0
推荐指数
2
解决办法
538
查看次数