我一直在研究一个项目,现在使用Devise进行用户身份验证.无论何时创建用户,它都会为它们生成密码盐以及加密密码.
当我进入这个项目的尾端时,我正在测试用户注册,并注意到我的新角色没有为这些新用户在数据库中创建密码盐,而我的老用户都有盐.新用户可以签到好,但我担心为什么Devise不再创造盐.
我遇到的Devise唯一的奇怪之处就是当我升级模块并记住日志说有关删除加密的内容时,因为bcrypt现在是默认加密,或者是那种效果.我这样做了......不确定这是否与当前问题有关.
另外,想想也许是我的项目被打包了,我从零开始创建了一个全新的Rails应用程序并添加了Devise,甚至这个新项目也没有为用户创建盐.
在Devise中设置密码盐是否有新方法,或者是否有人知道为什么盐不再被创建?不幸的是,Devise wiki在这个问题上没有太多可说的内容,到目前为止谷歌一直没有成功.
或者......首先是否需要加盐?我想,看起来更安全.
我的用户/设计配置如下.
配置/初始化/ devise.rb
Devise.setup do |config|
config.mailer_sender = "mail@domain.com"
require 'devise/orm/active_record'
config.authentication_keys = [ :login ]
config.stretches = 10
config.encryptor = :bcrypt
# Setup a pepper to generate the encrypted password.
config.pepper = "79c2bf3b[...]"
end
Run Code Online (Sandbox Code Playgroud)
应用程序/模型/ user.rb
devise :database_authenticatable, :registerable, :confirmable,
:recoverable, :rememberable, :trackable, :validatable
Run Code Online (Sandbox Code Playgroud)
UPDATE
我能够在Devise升级之后找到通知,其中包含......
[DEVISE] From version 1.2, there is no need to set your encryptor to bcrypt since encryptors are only enabled if you include :encryptable in your models. …Run Code Online (Sandbox Code Playgroud) 我正在尝试为我正在制作的节点应用程序配置Bcrypt,并且有几个关于盐的问题,我希望有人可以帮助我们回答.
什么是盐'圆'?例如,在GitHub的文档(https://github.com/kelektiv/node.bcrypt.js/)它使用一个盐一轮的10是什么意思是什么呢?
Bcrypt生成的盐总是一样吗?例如,如果我将用户的散列密码保存到数据库,那么它用于散列密码的盐是否与每个密码相同?
如何储存盐?是否可以抵御潜在的攻击?
我的理解是盐不是秘密的,它只是意图与任何集中标准不同,所以你不能开发彩虹表或类似的攻击来打破使用该算法的所有哈希值,因为盐分断裂彩虹桌.我在这里的理解可能不完全正确,所以如果我错了,请纠正我.
在一个广泛使用的开源软件中,盐会广为人知,这会让你受到攻击,因为现在他们可以简单地攻击哈希的盐渍版本并创建包含盐数据的彩虹表.
我认为,有两种方法可以解决这个问题.首先是使用每个新版本的软件更改salt,但这并不好,因为该软件的新版本将无法再针对旧密码哈希进行测试.
我想到的第二个解决方案是存储每个密码的盐; 换句话说,每个密码都有不同的盐.缺点是盐必须以某种方式与密码哈希相关联,可能只是将它们紧紧地放在数据库中的密码旁边.甚至可以使用用户名(但可能不会,用户名可能太短).
我的问题是,这可以接受吗?直接使用哈希密码存储盐有任何额外的风险吗?在我看来,在源代码中存储salt没有什么不同,因此通过使用密码存储salt不会造成安全性损失.
免责声明:我没有将它用于任何现实生活中的安全系统.事实上,我从未设计过任何类型的密码系统.我只是对自己的安全问题进行了模糊的教育.
我在添加新用户/ pwd时尝试添加一个盐,但文档似乎缺少如何执行此操作.
这是一个基本的例子:
<authentication-manager>
<authentication-provider user-service-ref="userDetailsService">
<password-encoder hash="md5">
<salt-source user-property="username"/>
</password-encoder>
</authentication-provider>
</authentication-manager>
Run Code Online (Sandbox Code Playgroud)
您可以通过示例看到,既未使用自定义salt或自定义密码编码器.
那么,在添加新用户/ pwd时,如何连接Salt?我认为这将是:
@Autowired SaltSource saltSource;
protected void foo(final CustomUser user) {
final PasswordEncoder encoder = new Md5PasswordEncoder();
user.setPassword(encoder.encodePassword(user.getPassword(), saltSource));
}
Run Code Online (Sandbox Code Playgroud)
但是,由于我使用的是默认的salt/password编码器,而且我没有自定义的salt bean,因此autowire会失败.
任何线索如何使这项工作?
在阅读了Jeff Atwood关于存储密码的帖子后,我偶然发现了BCrypt.net,这让我想到了Thomas Ptacek建议使用BCrypt来存储密码.这最终促成了我对BCrypt的C#实现
在上面最后一个链接的评论中,有人问"为什么GenerateSalt(30)永远服用,但GenerateSalt(31)似乎根本不花时间?"
我运行了BCrypt.HashPassword(密码,BCrypt.GenerateSalt(31))并在0毫秒内得到了我的结果.
我已经运行BCrypt.HashPassword("密码",BCrypt.GenerateSalt(30))超过5分钟,但仍然没有结果.
我意识到我们可能不需要随机生成的30个字符的盐来创建我们的密码哈希值(或BCrypt案例中的不可逆加密)多年.编辑我应该读一下代码,logRounds与salt长度没有任何关系.谢谢Aaronaught.
那么,为什么GenerateSalt(31)几乎立即返回一个值(当它需要大约两倍于GenerateSalt(30)的时候?
UPDATE
这是修复:
private byte[] CryptRaw(byte[] password, byte[] salt, int logRounds) {
// ... snip ...
uint rounds = 1U << logRounds;
// ... snip
}
Run Code Online (Sandbox Code Playgroud) 问题就是这样,在C#中生成随机盐(与哈希函数一起使用)的最佳方法是什么?
可能重复:
PHP密码的安全散列和盐
警告不要将MD5用于密码,请使用像bcrypt这样的替代方法
对于我的密码,我应该使用这样的盐(盐对每个用户都是唯一的,而不是直接用密码存储)...
$salt = sha1(md5("coders gonna code"));
$password = md5($salt.$password);
Run Code Online (Sandbox Code Playgroud)
或者如果我刚才使用它会没关系:
$password = md5($password);
Run Code Online (Sandbox Code Playgroud)
因为如果我使用盐,即使用户填写密码这样的密码也不重要,因为盐(在这种情况下)将是145ac26ff093c6e1317f7d5fb4c9fd11c77be975如此密码的条目将145ac26ff093c6e1317f7d5fb4c9fd11c77be975password根据http://howsecureismypassword.net/它需要3亿十亿年到破解....所以意见?或者我应该更糟糕的去吧
$password = md5($salt.$password.md5($salt));
Run Code Online (Sandbox Code Playgroud)
如果这个人已经走得足够远以获得盐哈希,那么任何东西都可以停下来再进一步吗?<更多声明此最后一个密码
对于那些说每个用户都应该这样做的人......我知道,这只是一个例子.
我已经在我的注册脚本中加密了密码,它们存储在数据库中,我必须使用它们登录,所以我想使用未加密的登录.我在这里读过一些帖子,但没有什么能帮到我.如何在login.php中添加它?盐也存储在数据库中.
这是我的register.php加密脚本
$hash = hash('sha256', $password1);
function createSalt()
{
$text = md5(uniqid(rand(), TRUE));
return substr($text, 0, 3);
}
$salt = createSalt();
$password = hash('sha256', $salt . $hash);
Run Code Online (Sandbox Code Playgroud)
这是我的login.php与季节
//Create query
$qry="SELECT * FROM member WHERE username='$username' AND password='$password'";
$result=mysql_query($qry);
//Check whether the query was successful or not
if($result) {
if(mysql_num_rows($result) > 0) {
//Login Successful
session_regenerate_id();
$member = mysql_fetch_assoc($result);
$_SESSION['SESS_MEMBER_ID'] = $member['id'];
$_SESSION['SESS_FIRST_NAME'] = $member['username'];
$_SESSION['SESS_LAST_NAME'] = $member['password'];
session_write_close();
header("location: profile.php");
exit();
}
else {
//Login failed
//error message
} …Run Code Online (Sandbox Code Playgroud) 有人可以帮我理解腌制的效果如何?
到目前为止,我理解以下内容:
我们如何存储盐,或者在用户登录时知道它是什么?我们将它存放在自己的领域吗?如果我们不这样做,应用程序如何确定盐是什么?如果我们存储它,它不会打败整个目的吗?
我被告知电子邮件是一个糟糕的盐,因为它不是唯一的并且与用户连接.
如果用户在2个站点上使用相同的密码,则会有相同的哈希值.
那么,它有什么问题?什么是攻击情形?
假设我们有哈希和盐.因此,其他站点在其数据库中具有相同的哈希值.我们如何在其他网站上对此用户造成任何伤害?我们可以吗?
我没有看到任何可能性,但我不是安全方面的专家,所以,我当然希望听到那些具有实际和具体答案的人.
我不会打破任何事情.我在这个问题的背景下问这个问题:是电子邮件还是(注册时间戳)好盐?
请一定和实际的答案.
salt ×10
hash ×4
passwords ×3
php ×3
security ×3
bcrypt ×2
c# ×2
bcrypt.net ×1
cryptography ×1
devise ×1
encryption ×1
mysql ×1
random ×1
sha256 ×1
spring ×1