Answers:
我通常created TIMESTAMP
在用户表中有一列,这样我就可以看到用户何时注册。我不喜欢为Salt添加其他列,因此我将timestamp列用作salt:
SHA1(password + created)
有关系吗?
盐有两个目的。这使得使用预先加密的大型表(“彩虹表”)变得不切实际,并且使相同的密码在哈希列表中看起来有所不同。使相同的密码看起来不同有助于避免多个人使用一个特定密码的问题,这大概是一个常见的弱密码。
因此,每个帐户都应有其自己独特的盐,并且在不会出现一组可能发生的盐的意义上,盐也不应过于可预测。(例如,如果许多站点从1开始并计数,那么坏人可以构建包括低盐的彩虹表。)除了一般不可预测的以外,它们在任何意义上都不必是随机的。它们没有比散列本身更秘密,因此它们不需要特别不可猜测。
使用任何方便的方法生成盐。如果与帐户数量相比有很多潜在的盐值(早期的Unix系统经常使用两个字节,可能的数目为65536),则半随机分配几乎永远不会给出重复的盐值。
利用框架。在.NET中,您可以使用RNGCryptoServoiceProvider ...
// If salt is not specified, generate it on the fly.
if (saltBytes == null)
{
// Define min and max salt sizes.
int minSaltSize = 4;
int maxSaltSize = 8;
// Generate a random number for the size of the salt.
Random random = new Random();
int saltSize = random.Next(minSaltSize, maxSaltSize);
// Allocate a byte array, which will hold the salt.
saltBytes = new byte[saltSize];
// Initialize a random number generator.
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
// Fill the salt with cryptographically strong byte values.
rng.GetNonZeroBytes(saltBytes);
}
其他框架应该具有可以利用的相似类。为了实现随机性,软件通常要雇用用户,而不是Random
如上所述。TrueCrypt会采用在指定区域随机移动鼠标以提供盐分的选项。它归结为您的特定需求和安全级别;因为你的盐简直可以!@#$%
。
您将生成一个盐服务器端,并在其创建后将其分配给用户帐户。最好使用框架提供的一些加密生成API,但原则上任何顺序都可以。
通常情况是这样存储的:
User
-------------------
ID
Username
PasswordHashWithSalt
例:
PasswordHashWithSalt =
A15CD9652D4F4A3FB61A2A422AEAFDF0DEA4E703 j5d58k4b56s8744q
在当今时代,仅使用bcrypt并阅读有关常规散列的文章并不是认真的保护。
考虑使用SDR零知识密码协议,该协议具有大量开源库,并且没有专利。
特别提款权需要食盐,而获得食盐的最佳场所是客户。定时击键,鼠标移动,对环境变量,随机数进行哈希处理,在其temp文件夹中创建文件的时间,以一种无法预测的方式使它们的末端远离服务器。SDR会花一些大功劳和用户密码,然后生成一个验证者密钥。您无需存储密码,它永远不会离开他们的计算机,但是您可以验证他们是否具有与验证程序密钥和盐一起使用的密码。它不受中间人攻击和字典攻击。为了确保安全,请加密数据库列中的密钥和盐。