C# 在C中验证symfony创建的密码#
我需要验证(而不是解密)在C#中的Symfony 2中创建的密码 在Symfony 2中构建的现有应用程序正在用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
security:
encoders:
Symfony\Component\Security\Core\User\User: plaintext
API\CoreEntityBundle\Entity\User:
algorithm: sha512
iterations: 512
encode_as_base64: true
如何可靠地散列给定密码并与存储的令牌进行比较,以确定提供的密码是否正确
salt
中。如果不是,只需将密码存储在salted
中即可进行散列,存储在摘要中
迭代-1次(本例中为511次):
- 连接
摘要
和盐渍
- 使用sha512进行哈希连接,将结果存储在下一次迭代的
摘要中
摘要
您还可以查看
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)。