C# 有没有一种方法可以使用MD5通过DirectoryServices对LDAP进行身份验证?
我正在使用VS 2012、C.NET并创建一个表单来通过LDAP进行身份验证 我有这个代码,它运行良好:C# 有没有一种方法可以使用MD5通过DirectoryServices对LDAP进行身份验证?,c#,ldap,md5,directoryentry,C#,Ldap,Md5,Directoryentry,我正在使用VS 2012、C.NET并创建一个表单来通过LDAP进行身份验证 我有这个代码,它运行良好: root = new DirectoryEntry( "LDAP://192.168.116.20:389", username, password ); 用户名和密码都是纯文本 但是我想创建一个记住密码?复选框,我可以将用户名和密码md5散列保存在文件中 那么,如何使用
root = new DirectoryEntry(
"LDAP://192.168.116.20:389",
username,
password
);
用户名和密码都是纯文本
但是我想创建一个记住密码?复选框,我可以将用户名和密码md5散列保存在文件中
那么,如何使用带有DirectoryEntry和LDAP的md5哈希进行身份验证?!有可能吗?我不这么认为,LDAP是一种协议,它可以对抗LM/NT哈希,它们分别是DES和MD4,但级别较低。您可能要做的是加密密码,保存密码,然后解密密码并将其传递给LDAP字符串。我不这么认为,LDAP是一种协议,它可以对抗LM/NT哈希,它们分别是DES和MD4,但级别较低。您可能需要对密码进行加密、保存、解密并将其传递给LDAP字符串
我不这么认为,LDAP是一种协议,它可以对抗LM/NT 散列,它们分别是DES和MD4,但这是较低的级别 LDAP是一种协议,但LDAP不使用LM/NT哈希 从LDAP可以通过从LDAP执行LM/NT/Kerboros和md5哈希,但前提是LDAP客户端和LDAP服务器具有利用SASL的能力 我认为wk3服务器在ROOTDSE中显示: 支持的SASLME机制:摘要-MD5 支持的SASLME机制:外部 支持的SASLME机制:GSS-SPNEGO 支持的SASLME机制:GSSAPI 这意味着DIGEST-MD5在AD中受支持。我不知道目录服务API是否支持这一点
我不这么认为,LDAP是一种协议,它可以对抗LM/NT 散列,它们分别是DES和MD4,但这是较低的级别 LDAP是一种协议,但LDAP不使用LM/NT哈希 从LDAP可以通过从LDAP执行LM/NT/Kerboros和md5哈希,但前提是LDAP客户端和LDAP服务器具有利用SASL的能力 我认为wk3服务器在ROOTDSE中显示: 支持的SASLME机制:摘要-MD5 支持的SASLME机制:外部 支持的SASLME机制:GSS-SPNEGO 支持的SASLME机制:GSSAPI
这意味着DIGEST-MD5在AD中受支持。我不知道目录服务API是否支持这一点。如果选择将数据加密到文件,则应使用System.Security.ProtectedData类 您加密的数据可以绑定到当前用户或正在进行编码/解码的当前计算机 您应该使用两种简单的方法: 保护-获取字节数组并加密数据。 取消保护-获取加密数据并返回字节数组。 示例:
private static void EncryptData(string data, Stream stream)
{
if (stream.CanWrite == false)
throw new IOException("Cannot write to stream.");
var bytes = Encoding.UTF8.GetBytes(data);
var encryptedBytes = ProtectedData.Protect(bytes, null, DataProtectionScope.CurrentUser);
stream.Write(encryptedBytes , 0, encryptedBytes .Length);
}
private static string DecryptData(Stream stream)
{
if (stream.CanRead == false)
throw new IOException("Cannot read fromstream.");
using (MemoryStream memoryStream = new MemoryStream())
{
stream.CopyTo(memoryStream);
var encryptedBytes = memoryStream.ToArray();
var decryptedBytes = ProtectedData.Unprotect(encryptedBytes, null, DataProtectionScope.CurrentUser)
return Encoding.UTF8.GetString(decryptedBytes);
}
}
现在,为了在文件流中使用它们,只需:
public static void Encrypt(string password)
{
using (var fileStream = new FileStream(@"MyFile.dat", FileMode.Create))
{
EncryptData(password, fileStream);
fileStream.Close();
}
}
public static string Decrypt()
{
string password;
using (var fileStream = new FileStream(@"MyFile.dat", FileMode.Open))
{
password = DecryptData(fileStream);
fileStream.Close();
}
return password;
}
顺便说一下,如果您想增加加密的复杂性,可以将熵传递给Protect和Unprotect方法。
有关详细信息,请参阅:如果选择将数据加密到文件,则应使用System.Security.ProtectedData类 您加密的数据可以绑定到当前用户或正在进行编码/解码的当前计算机 您应该使用两种简单的方法: 保护-获取字节数组并加密数据。 取消保护-获取加密数据并返回字节数组。 示例:
private static void EncryptData(string data, Stream stream)
{
if (stream.CanWrite == false)
throw new IOException("Cannot write to stream.");
var bytes = Encoding.UTF8.GetBytes(data);
var encryptedBytes = ProtectedData.Protect(bytes, null, DataProtectionScope.CurrentUser);
stream.Write(encryptedBytes , 0, encryptedBytes .Length);
}
private static string DecryptData(Stream stream)
{
if (stream.CanRead == false)
throw new IOException("Cannot read fromstream.");
using (MemoryStream memoryStream = new MemoryStream())
{
stream.CopyTo(memoryStream);
var encryptedBytes = memoryStream.ToArray();
var decryptedBytes = ProtectedData.Unprotect(encryptedBytes, null, DataProtectionScope.CurrentUser)
return Encoding.UTF8.GetString(decryptedBytes);
}
}
现在,为了在文件流中使用它们,只需:
public static void Encrypt(string password)
{
using (var fileStream = new FileStream(@"MyFile.dat", FileMode.Create))
{
EncryptData(password, fileStream);
fileStream.Close();
}
}
public static string Decrypt()
{
string password;
using (var fileStream = new FileStream(@"MyFile.dat", FileMode.Open))
{
password = DecryptData(fileStream);
fileStream.Close();
}
return password;
}
顺便说一下,如果您想增加加密的复杂性,可以将熵传递给Protect和Unprotect方法。
有关更多信息,请参阅:我想这是唯一的方法。非常感谢。我想这是唯一的办法。非常感谢。