- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
所以我对编程 (C#) 相当陌生,尤其是一般的密码学。我尝试通过使用 MD5 散列算法复制几个函数并学习它的工作原理来学习一些。然后我连接到数据库并进行了登录和重置密码功能。然而,当我尝试制作相同的密码时,问题出现了,我意识到无论我在哈希值中添加随机生成的盐,哈希值都会变成相同的。
string MD5(string input)
{
MD5 md5 = new MD5CryptoServiceProvider();
byte[] bytes = md5.ComputeHash(Encoding.Unicode.GetBytes(input));
string result = BitConverter.ToString(bytes).Replace("-", String.Empty);
return result.ToLower();
}
public static byte[] GenerateSalt()
{
RNGCryptoServiceProvider saltGenerator = new RNGCryptoServiceProvider();
byte[] salt = new byte[24];
saltGenerator.GetBytes(salt);
return salt;
}
所以这是我生成 salt 和散列输入字符串的函数。这是通过在 WinForms 中填写两个文本框来重置密码的代码。
private void HashNewPassword(out byte[] salt, out string hashedPassword)
{
string tempHash;
salt = null;
hashedPassword = null;
if (txtPassword1.Text == txtPassword2.Text)
{
tempHash = txtPassword1.Text;
salt = GenerateSalt();
hashedPassword = MD5(MD5(tempHash + salt));
}
else
{
throw new Exception();
}
}
最后,click-even 函数:
private void btnFinished_Click(object sender, EventArgs e)
{
try
{
string hashedPassword;
byte[] salt;
HashNewPassword(out salt, out hashedPassword);
AddPasswordToDB(salt, hashedPassword);
}
catch (Exception error)
{
MessageBox.Show(error.Message + " : " + error.GetType().ToString());
}
}
正如您在下面看到的,散列值相同,但盐不同。我是否以不应该的方式添加了盐?
bec78d2acfd2eb4f5d7da2fd231bad1c 0x21B5F48096E31092FCCD20EE22EF9B3C307ADDC1C31B8D84
bec78d2acfd2eb4f5d7da2fd231bad1c 0xC063774EBBD4FAED268811C84D70662F4DDB53BCA52A6720
对此有合理的解释,还是代码有问题?另外,我不熟悉散列算法,只是偶然发现并想了解更多信息。有更简单的方法吗?我读过其他看起来很容易使用的算法,但正如我所说,我对此并不熟悉。哈希算法之间的安全差异无关紧要。我确实读到过 MD5 很旧而且不那么安全,但它对我的使用来说绰绰有余。
提前致谢。
最佳答案
在不涉及安全方面的情况下,我相信您会得到相同的哈希值,因为您没有将 salt 连接为字符串:tempHash + salt
salt
是一个字节数组,通过使用 +
和 string
,它的 ToString()
方法是在串联之前调用。这将不会产生具有实际值的字符串。
尝试将数组转换为实际的字符串:
System.Text.Encoding.Default.GetString(盐)
一个小例子来进一步阐明行为:
byte[] salt = new byte[] {67,79,79,76};
Console.WriteLine(salt.ToString()); // prints System.Byte[]
string saltAsString = System.Text.Encoding.Default.GetString(salt);
Console.WriteLine(saltAsString); // prints COOL
关于c# - 初学者散列和加盐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36048815/
我正在阅读有关如何对 key 进行加盐以使您的加密安全的教程,但无法充分利用它。我不太了解密码学,需要一些帮助。我正在使用 commoncrypto 来加密文件,并且完成了,除了它不安全的事实....
我是一个加密新手,但需要在存储到数据库之前对敏感的个人数据进行加密。我计划将 AES 与 CBC 结合使用,但也想使用盐。然而,我找不到一种方法来做到这一点(除了 BouncyCaSTLe,我的主机由
升级到 php7 后,BCryptPasswordEncoder 抛出以下错误,例如在使用 FOSUserBundle 标准注册页面注册时: "Use of the 'salt' option to
这个简单的代码接受用户输入并将给定字符串的 sha256 打印到标准输出。 #include #include #include #include int main() { SHA256_C
我想知道以下设置的严重问题是什么: 用户名/密码登录方案Javascript/ajax 从服务器请求盐值(我们在前面的问题中已经确定盐不是 secret 值)Javascript 对密码和盐执行 SH
我一直在 ruby 应用程序中创建加盐密码,我认为这是标准方式: password_salt = BCrypt::Engine.generate_salt password_hash = BCry
我听说过有人在使用这种方法,想知道这意味着什么。我只是知道这是个坏主意! 据我所知,在将哈希存储到数据库之前对密码进行加盐处理的主要目的是使每个哈希算法都独一无二,因此在尝试破解它时需要为每个用户提供
我需要编码/加密数据库 ID 并将它们附加到我的 URL。安全性不是我要处理的问题,但我正在寻找具有适度安全性的东西。主要目标是拥有唯一且 URL 安全的短 ID。 下面的代码片段似乎可以满足我的需要
我正在使用 RC4 C++ 程序进行更多工作,以与命令行参数兼容。 我想知道是否有人可以指出一些关于命令行 openssl rc4 在加密和解密时如何使用盐的体面文档的方向,这样我就可以在我的程序中加
我有一个字符串需要在 C# 中使用 salt 进行哈希处理并匹配它在 PHP 中的结果。 C#代码如下: string stringToHash = "123"; st
这个问题在这里已经有了答案: 关闭 9 年前。 Possible Duplicate: Secure hash and salt for PHP passwords 我在 stackoverflow
我有一个项目,显然该软件的设计者没有考虑安全性。 密码以明文形式存储并通过明文传输。所以我剩下的任务就是解决这个问题。 我对安全性有点生疏,所以我的问题是:对于在线用户密码身份验证,使用散列/加盐技术
盐的新手,我添加了第一个服务器(wx-1),它可以工作,但是当我添加不同的服务器时,test.ping 没问题,但是当执行 salt 'qing' state.highstate 时,失败,错误信息为
我使用此 openssl 命令创建了一条加密消息: openssl enc -aes-256-cbc -salt -in plaintext.txt -out cipher.enc 我尝试过 Cryp
我正在对许多列执行联接,这些列有时可能包含数十亿行空值,因此我想对列加盐以防止联接后出现倾斜,如 Jason Evan 的帖子中提到的:https://stackoverflow.com/a/4339
我是一名优秀的程序员,十分优秀!