C# 在C中验证symfony创建的密码#

C# 在C中验证symfony创建的密码#,c#,symfony,passwords,C#,Symfony,Passwords,我需要验证(而不是解密)在C#中的Symfony 2中创建的密码 在Symfony 2中构建的现有应用程序正在用C#重写。安全令牌存储在本地数据库中 当前的Symfony密码设置为 security: encoders: Symfony\Component\Security\Core\User\User: plaintext API\CoreEntityBundle\Entity\User: algorithm: sha512

我需要验证(而不是解密)在C#中的Symfony 2中创建的密码

在Symfony 2中构建的现有应用程序正在用C#重写。安全令牌存储在本地数据库中

当前的Symfony密码设置为

security:
    encoders:
        Symfony\Component\Security\Core\User\User: plaintext
        API\CoreEntityBundle\Entity\User:
            algorithm: sha512
            iterations: 512
            encode_as_base64: true
如何可靠地散列给定密码并与存储的令牌进行比较,以确定提供的密码是否正确

  • 如果您的密码是salt:将密码与“{salt}”连接起来(这样“EncodedPassword{SaltUsed}”是最后一个字符串),存储在
    salt
    中。如果不是,只需将密码存储在
    salted
    中即可
  • 使用sha512对盐腌的
    进行散列,存储在
    摘要中
  • 重复
    迭代-1次(本例中为511次):
    
    • 连接
      摘要
      盐渍
    • 使用sha512进行哈希连接,将结果存储在下一次迭代的
      摘要中
  • Base64编码最后的
    摘要

  • 您还可以查看
    Symfony\Component\Security\Core\Encoder\MessageDigestPasswordEncoder
    以了解实现。

    这是一个工作版本

    string CalculateHash(string plain, string salt)
            {
                var salted = $"{plain}{{{salt}}}";
    
                var saltedBytes = Encoding.UTF8.GetBytes(salted);
    
                using (var sha512 = SHA512.Create())
                {
                    var digest = sha512.ComputeHash(saltedBytes);
    
                    var outputBytes = new byte[digest.Length + saltedBytes.Length];
    
                    for (var iteration = 1; iteration < 512; iteration++)
                    {
                        Buffer.BlockCopy(digest, 0, outputBytes, 0, digest.Length);
                        Buffer.BlockCopy(saltedBytes, 0, outputBytes, digest.Length, saltedBytes.Length);
    
                        digest = sha512.ComputeHash(outputBytes);
                    }
    
                    var result = Convert.ToBase64String(digest);
    
                    return result;
                }
    
    string CalculateHash(字符串普通、字符串盐)
    {
    var salted=$“{plain}{{{salt}}”;
    var saltedBytes=Encoding.UTF8.GetBytes(salted);
    使用(var sha512=sha512.Create())
    {
    var digest=sha512.ComputeHash(saltedBytes);
    var outputBytes=新字节[digest.Length+saltedBytes.Length];
    对于(var迭代=1;迭代<512;迭代++)
    {
    块复制(摘要,0,outputBytes,0,摘要,长度);
    块复制(saltedBytes,0,outputBytes,digest.Length,saltedBytes.Length);
    digest=sha512.ComputeHash(输出字节);
    }
    var result=Convert.tobase64字符串(摘要);
    返回结果;
    }
    
    您的输入帮助我找到了我发布的解决方案。非常重要的是您要重复执行的注释(迭代-1)。