标签: salt

如何在Java中为Salted-Hash生成SALT?

我一直在寻找,最接近的答案是:如何生成一个随机的字母数字字符串?

我想根据这个CrackStation教程来遵循这个工作流程:

存储密码

  1. 使用CSPRNG生成长的随机盐.

  2. 将salt添加到密码中,并使用标准加密哈希函数(如SHA256)对其进行哈希处理.

  3. 将salt和hash都保存在用户的数据库记录中.

验证密码

  1. 从数据库中检索用户的salt和hash.

  2. 将salt添加到给定密码并使用相同的哈希函数对其进行哈希处理.

  3. 将给定密码的哈希值与数据库中的哈希值进行比较.如果匹配,则密码正确.否则,密码不正确.

我不知道如何生成SALT.我想出了如何使用MessageDigest生成哈希.我尝试使用SecureRandom,但nextByte方法产生乱码.

编辑:我不知道选择哪个答案,对我来说太复杂了,我决定使用jBCrypt; jBCript很容易使用,在幕后做所有复杂的事情.所以我会让社区投票给出最佳答案.

java security encryption hash salt

41
推荐指数
2
解决办法
8万
查看次数

密码散列,盐和散列值的存储

假设您可以自由决定如何将散列密码存储在DBMS中.像这样的计划有明显的弱点吗?

要创建存储在DBMS中的哈希值,请执行以下操作:

  • 作为salt的一部分,DBMS服务器实例唯一的值,
  • 用户名作为盐的第二部分,
  • 并使用实际密码创建salt的串联,
  • 并使用SHA-256算法散列整个字符串,
  • 并将结果存储在DBMS中.

这意味着任何想要发生冲突的人都必须分别为每个用户名和每个DBMS服务器实例单独完成工作.我打算保持实际的哈希机制有点灵活,以允许使用仍在使用的新NIST标准哈希算法(SHA-3).

"DBMS服务器实例独有的值"不一定是秘密的 - 尽管它不会随便泄露.目的是确保如果有人在不同的DBMS服务器实例中使用相同的密码,则记录的哈希值会有所不同.同样,用户名也不是秘密 - 只需要密码.

首先使用密码以及用户名和"唯一值"第二个,或三个数据源的任何其他排列是否有任何优势?或者交错字符串怎么样?

我是否需要添加(并记录)随机盐值(每个密码)以及上述信息?(优点:用户可以重新使用密码,但仍然可能会在数据库中记录不同的哈希值.缺点:必须记录盐.我怀疑其优势远大于缺点.)

有很多相关的SO问题 - 这个列表不太可能是全面的:

我认为这些问题的答案支持我的算法(尽管如果你只是使用随机盐,那么'每个服务器的唯一值'和用户名组件就不那么重要了).

security encryption hash salt

38
推荐指数
4
解决办法
2万
查看次数

使用盐在SHA512中哈希? - Python

我一直在查看hashlib文档但是在散列数据时没有找到任何关于使用salt的内容.

帮助会很棒.

python salt sha saltedhash hashlib

38
推荐指数
4
解决办法
5万
查看次数

如何产生良好的盐 - 我的功能足够安全吗?

这是我用来生成随机盐的函数:

function generateRandomString($nbLetters){
    $randString="";
    $charUniverse="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    for($i=0; $i<$nbLetters; $i++){
       $randInt=rand(0,61);
        $randChar=$charUniverse[$randInt];
        $randString=$randomString.$randChar;
    }
    return $randomString;
}
Run Code Online (Sandbox Code Playgroud)

这是针对非商业网站的.它仅用于生成salt(存储在db中并与用户提交的pw一起用于散列).

这个合适吗?我应该使用更大的字符子集,如果是这样,在PHP中有一个简单的方法吗?

php security salt

38
推荐指数
3
解决办法
6万
查看次数

盐和哈希,为什么不使用用户名?

我必须承认是在大多数的相关Web应用程序的高科技安全问题主要是无知的,但有一件事我至少想我可以问,因为它是(希望)一个具体的答案一个直接的问题.

以这个网站:http://www.15seconds.com/issue/000217.htm

它显示了它们将盐值存储在表中的一点点,我理解使用盐的原理和数学,但我想知道这个:

  • 为什么他们不只是使用用户名作为盐值而不是生成一个?

passwords hash salt username

35
推荐指数
2
解决办法
1万
查看次数

每个密码需要一次"随机盐",每个数据库只需要一次吗?

我之前关于PHP/MySQL中的盐渍密码的问题之后,我还有另外一个关于盐的问题.

当有人说"使用随机盐"来预先/附加密码时,这是否意味着:

  • 创建静态1次随机生成的字符串,
  • 创建每次创建密码时随机更改的字符串

如果盐对于每个用户来说是随机的并且与散列密码一起存储,那么原始盐如何被检索回来进行验证?

security passwords hash salt

31
推荐指数
1
解决办法
8458
查看次数

为什么crypt/blowfish使用两种不同的盐生成相同的哈希?

这个问题与PHP的实现有关crypt().对于这个问题,盐的前7个字符不计算,所以盐' $2a$07$a'的长度为1,因为它只有盐的1个字符和元数据的7个字符.

当使用长度超过22个字符的salt字符串时,生成的哈希值没有变化(即截断),当使用短于21个字符的字符串时,盐将自动填充($显然有' '字符); 这是相当简单的.但是,如果给出20个字符的盐和21个字符的盐,除了21个长度的盐的最终字符外两个是相同的,两个散列字符串都是相同的.一个长22个字符的盐,除了最后一个字符外,它与21个长度的盐相同,哈希值会再次不同.

代码示例:

$foo = 'bar';
$salt_xx = '$2a$07$';
$salt_19 = $salt_xx . 'b1b2ee48991281a439d';
$salt_20 = $salt_19 . 'a';
$salt_21 = $salt_20 . '2';
$salt_22 = $salt_21 . 'b';

var_dump(
    crypt($foo, $salt_19), 
    crypt($foo, $salt_20), 
    crypt($foo, $salt_21), 
    crypt($foo, $salt_22)
);
Run Code Online (Sandbox Code Playgroud)

会产生:

string(60) "$2a$07$b1b2ee48991281a439d$$.dEUdhUoQXVqUieLTCp0cFVolhFcbuNi"
string(60) "$2a$07$b1b2ee48991281a439da$.UxGYN739wLkV5PGoR1XA4EvNVPjwylG"
string(60) "$2a$07$b1b2ee48991281a439da2.UxGYN739wLkV5PGoR1XA4EvNVPjwylG"
string(60) "$2a$07$b1b2ee48991281a439da2O4AH0.y/AsOuzMpI.f4sBs8E2hQjPUQq"
Run Code Online (Sandbox Code Playgroud)

为什么是这样?

编辑:

一些用户注意到整个字符串存在差异,这是正确的.在salt_20,偏移(28,4)是da$.,而在salt_21,偏移(28,4)是da2.; 但是,重要的是要注意生成的字符串包括散列,盐,以及生成盐的指令(即$2a$07$); 实际上,差异发生的部分仍然是盐.实际哈希值不变UxGYN739wLkV5PGoR1XA4EvNVPjwylG.

因此,这实际上并不是产生的散列的差异,而是用于存储散列的盐的差异,这恰恰是手头的问题:两个盐生成相同的散列.

Rembmer:输出将采用以下格式:

"$2a$##$saltsaltsaltsaltsaltsaHASHhashHASHhashHASHhashHASHhash"
//                            ^ Hash Starts …
Run Code Online (Sandbox Code Playgroud)

php hash crypt blowfish salt

30
推荐指数
2
解决办法
1万
查看次数

如何在Java中生成SALT值?

在Java中生成SALT值的最佳方法是什么,它是一个至少32字节长的字符串?

java salt spring-security

30
推荐指数
1
解决办法
2万
查看次数

WebMatrix WebSecurity PasswordSalt

我正在使用WebMatrix,并建立了一个基于"StarterSite"的网站.在这个初学者网站中,您将获得一个很好的基本布局 - 包括注册,登录,忘记密码页等...

我注意到在数据库中"webpages_Membership"表有一个名为"PasswordSalt"的列.创建一些新用户帐户后,此列始终为空.所以我假设没有使用密码盐(甚至不是默认密码).

显然这不是最佳实践,但我似乎无法找到任何文档告诉我如何设置或管理密码盐.

如何使用WebSecurity Helper设置密码salt?

c# passwords asp.net-mvc salt webmatrix

27
推荐指数
1
解决办法
4837
查看次数

什么是盐轮以及盐如何储存在Bcrypt中?

我正在尝试为我正在制作的节点应用程序配置Bcrypt,并且有几个关于盐的问题,我希望有人可以帮助我们回答.

  • 什么是盐'圆'?例如,在GitHub的文档(https://github.com/kelektiv/node.bcrypt.js/)它使用一个盐一轮的10是什么意思是什么呢?

  • Bcrypt生成的盐总是一样吗?例如,如果我将用户的散列密码保存到数据库,那么它用于散列密码的盐是否与每个密码相同?

  • 如何储存盐?是否可以抵御潜在的攻击?

passwords hash salt password-protection bcrypt

25
推荐指数
2
解决办法
1万
查看次数