C#:从/etc/shadow用salt为linux用户验证密码散列(SHA512)

C#:从/etc/shadow用salt为linux用户验证密码散列(SHA512),c#,hash,passwords,salt,password-hash,C#,Hash,Passwords,Salt,Password Hash,我想用本机C#code(.NET Core)验证Linux用户的用户凭据(名称和密码)。 Linux系统上的用户凭据通常存储在文件中:/etc/shadow 例如,名为“csharp”且密码为“1337”的用户在文件/etc/shadow中有以下条目: string entry=“csharp:$6$qVnvjWpk$doutmbc9roz6s1h0hcztywlffvewdbz8f0eufpejec2ukqv0griifogpnaa.8i4RCcrGpOEHEd9xrAUDpo3Y/:1833

我想用本机C#code(.NET Core)验证Linux用户的用户凭据(名称和密码)。 Linux系统上的用户凭据通常存储在文件中:/etc/shadow

例如,名为“csharp”且密码为“1337”的用户在文件/etc/shadow中有以下条目:

string entry=“csharp:$6$qVnvjWpk$doutmbc9roz6s1h0hcztywlffvewdbz8f0eufpejec2ukqv0griifogpnaa.8i4RCcrGpOEHEd9xrAUDpo3Y/:18337:0:9999:7:”
  • 第一个“:”前面的字符串是用户=>条目的名称。拆分(“:”[0](csharp)

  • 第一个“$”后面的字符是hash method=>条目。Split(“$”[1](6=SHA256)。可能的方法有:MD5=>1;SHA256=>5;SHA512=>6

  • 第二个“$”后面的字符串是salt(或hash?)=>条目。Split(“$”[2](qVnvjWpk)

在带有“openssl passwd-6-salt qVnvjWpk 1337”的Linux系统上使用程序时,它将给出以下输出:

但是,如何使用本机csharp代码而不使用openssl程序来实现这一点呢

我有以下方法来做这件事

检查凭证(“csharp”、“1337”);
publicstaticboolcheckcredentials(字符串用户名、字符串密码){
string[]shadow=File.ReadAllLines(“/etc/shadow”);
foreach(阴影中的字符串条目){
//条目=csharp:$6$qVnvjWpk$DOUTMBC9ROZ6S1H0HCZTYWLFVEUWDBZ8F0EUFPEJEC2UKQV0GRIEIFOGPNAA.8i4RCcrGpOEHEd9xrAUDpo3Y/:18337:0:9999:7::
if(entry.Split(“:”[0]==用户名){
//哈希=6f0ac65fe01188660aad900bfe16c566ebf0e56c0a7d4a15bd831049108de80bd3a2fbf1a8b91662433a40458ec208a207cab073f190bd65b889e95e4fca8e09
//$6=>SHA512
字符串hash=HashSHA512(密码);
//盐=qvvwpk
字符串salt=entry.Split(“$”[2];

//>>>现在如何检查给定的密码“1337”?它确实很复杂。我找到了一些实现的代码。它是由SHA-512支持的。然后,我对它进行了修改,现在我可以自己使用它了。(在这个回答中真的没有更多要提及的内容…)

这确实很复杂。我找到了一些实现的代码。它是由SHA-512支持提供的。然后我对它进行了修改,现在我可以自己使用它了。(在这个答案中没有更多要提及的内容了…)

您找到解决方案了吗?我也需要这样做,用新应用程序验证旧数据库中的密码。似乎是。我最好为此找到一个库。您找到解决方案了吗?我也需要用新应用程序验证旧数据库中的密码。似乎是。我最好为此找到一个库。 $6$qVnvjWpk$DOUTmbC9ROZ6s1h0hCZTYWLFfVeUWDbz8f0EUFPEJEC2UKQV0gRiIfoGpnaA.8i4RCcrGpOEHEd9xrAUDpo3Y/