我在C#中制作一个有密码的程序,我需要加密它们。到目前为止,我向后翻转字符串(所以你好成为olleh)然后我使用循环遍历每个字符,并且其中的循环遍历另一个字符串,该字符串具有转换后的字母以查看它们是否匹配。使用这个,你好= Ghh#$所以它工作正常。所以无论如何,我可以添加任何额外的东西吗? PS什么是腌制以及如何以一种方式进行散列?
答案 0 :(得分:7)
加密规则之一是不编写自己的加密方案。而是使用诸如http://www.cryptlib.com/why-use-cryptlib-10-good-reasons之类的库,它具有C#的绑定。
有关更多信息,请查看第一个答案: https://security.stackexchange.com/questions/2202/lessons-learned-and-misconceptions-regarding-encryption-and-cryptology
答案 1 :(得分:3)
首先,加密和散列之间的区别在于,高级别的加密数据可以使用正确的密钥解密,而散列数据除了通过预生成或彩虹表之类的强力方法外无法检索。
通过在用户每次登录时以与创建帐户时相同的方式对用户的输入进行散列并比较散列的结果来验证散列密码。对于任何给定的输入,散列结果应该相同。
强制性咆哮:
有一个很好的论据,即使用加密强算法对密码始终进行哈希处理。您可能会听到“我的申请/网页/等不是那么重要,那里没有敏感信息”或“我只是在学习它并不重要”的借口,但事实是,如果我可以破解一个网站的安全性,或者你让你的机器登录,我从你的“教育”应用程序窃取你的密码文件,我可以拿走所有用户的电子邮件地址,并且几乎保证至少有一些人会使用该Gmail或雅虎帐户的密码相同。然后,我可以为他们的电子邮件告诉我他们有帐户的任何网站发送重置请求,并且也可以访问这些网站。 所以非常重要的是,无论你在写什么软件,如果它存储密码,你都应该做负责任的事情并正确地哈希+哈希。
答案 2 :(得分:3)
盐:http://en.wikipedia.org/wiki/Salt_(cryptography) 哈希:http://en.wikipedia.org/wiki/Cryptographic_hash_function
简单示例:
var salt = "abc123";
var encryptedPassword = HashingAlgorithm("password");
var encryptedSaltedPassword = HashingAlgorithm ("password" + salt);
Console.Writeline(encryptedPassword);
Console.Writeline(encryptedSaltedPassword);
写出
aIdekXieklKq309nasdf
dfk#cxk)8lkdfesijcde
腌制代码的目的是防止字典攻击。如果有人弄清楚你的HashingAlgorithm,他们可以通过字典中的每个单词来强制执行,并找出“密码”哈希是“aIdekXieklKq309nasdf”。如果你加密你的待加密词,他们也必须知道你的盐词。
此外,将密码散列到数据库中而不是使用某种双向算法是很好的,这样任何人(包括您和您的同事)都可以访问数据库,可以查看并查看用户使用的密码(因为很多用户倾向于在多个站点上重复使用相同的密码)。