如何轻松地从Textbox.Text中获取密码?
.NET框架中是否有一些内置的魔法?
我很难理解当密码数据库或其他重要信息被泄露时,附加到散列的salt如何帮助提高安全性.
如果盐是,例如,"你好",并附加到密码"密码",那么盐和密码一起存储,"hellopassword"并散列产生:
94e66f94517d606d5ad6d9191b980408952f2ed2 (sha1)
Run Code Online (Sandbox Code Playgroud)
然后附上盐:
hello$94e66f94517d606d5ad6d9191b980408952f2ed2
Run Code Online (Sandbox Code Playgroud)
这怎么更安全?攻击者知道盐,所以现在可以用很少的额外难度计算密码......对吧?还是我从根本上误解了什么?
在这里阅读了一些关于盐渍密码的信息后,似乎最好为每个用户使用一种独特的盐.我正在努力实现Flask-Security atm,从文档看来你只能设置一个全局盐:即SECURITY_PASSWORD_SALT ='thesalt'
问题:如何为每个密码制作一个独特的盐?
谢谢!
编辑:从Flask-Security上的文档中我发现了这一点,这似乎再次暗示这个模块只对开箱即用的所有密码使用一个盐.
flask_security.utils.get_hmac(password)
Returns a Base64 encoded HMAC+SHA512 of the password signed with the salt
specified by SECURITY_PASSWORD_SALT.
Run Code Online (Sandbox Code Playgroud) 我想加盐如:
PasswordEncoder encoder = new ShaPasswordEncoder();
userDetails.setPassword(encoder.encodePassword(userDetails.getPassword(),saltSource.getSalt(userDetails));
Run Code Online (Sandbox Code Playgroud)
到目前为止userDetails我的自定义UserDetail类的实例,我不得不把它投射到这个Spring类:UserDetails
,但是从逻辑上预期我得到了运行时:
java.lang.ClassCastException: model.UserDetails cannot be cast to org.springframework.security.core.userdetails.UserDetails
Run Code Online (Sandbox Code Playgroud)
配置:
<beans:bean id="saultSource" class="org.springframework.security.authentication.dao.ReflectionSaltSource">
<beans:property name="userPropertyToUse" value="username"/>
</beans:bean>
<authentication-manager alias="authenticationManager">
<authentication-provider>
<password-encoder hash="sha">
<salt-source user-property="username"/>
</password-encoder>
<jdbc-user-service data-source-ref="dataSource"/>
</authentication-provider>
</authentication-manager>
Run Code Online (Sandbox Code Playgroud)
在这种情况下如何正确配置盐?
我正在尝试生成河豚哈希,我想知道它是否足够安全,可以依靠mt_rand()来为我生成盐?
function blowfish($string, $salt = NULL, $iterations = '08')
{
if( ! $salt)
{
$seed = "./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
for ($i = 0; $i < 22; $i++)
{
$salt .= $seed{mt_rand(0, 63)};
}
$salt = '$2a$' . $iterations . '$' . $salt;
}
return crypt($string, $salt);
}
Run Code Online (Sandbox Code Playgroud)
上面的字符$ seed是允许的64个字符的河豚盐字母表.我打算用它来生成和比较密码.
$password = 'my^$%#password';
$hash = blowfish($password);
if($hash = blowfish($password, $hash))
{
print "Matches\n";
print $hash . "\n";
}
Run Code Online (Sandbox Code Playgroud)
我从来没有意识到这一点,但@zerkms说的是真的.盐只是为了防止可重复使用的预先计算的攻击,因为盐在他们可以访问哈希的同一点上是已知的.所以目标不是一种不可逆的盐 - 它是一种随机的盐.
那么,这有什么不对吗?
function blowfish($string, $salt …Run Code Online (Sandbox Code Playgroud) 所以,我有一个从数据库中读取/验证(和写入)密码哈希的网站,我有一些东西可以生成SHA-512样式的密码哈希,看起来像:
$6$GloHensinmyampOc$AxvlkxxXk36oDOyu8phBzbCfLn8hyWgoYNEuqNS.3dHf4JJrwlYCqha/g6pA7HJ1WwsADjWU4Qz8MfSWM2w6F.
Run Code Online (Sandbox Code Playgroud)
该网站是基于java的,所以我为它写了一个SHA-512哈希.麻烦的是,有一堆perl cron作业运行,还需要偶尔验证密码哈希到数据库,并且由于那些在Solaris机箱上运行,它的crypt不支持$ 6 $格式.
所以,当我这样做时:
printf("crypt => '%s'\n",crypt("Hello",'$1$CygnieHyitJoconf$'));
Run Code Online (Sandbox Code Playgroud)
我理智地回来了:
crypt => '$1$CygnieHy$n9MlDleP0qmGCfpbnVYy11'
Run Code Online (Sandbox Code Playgroud)
然而,如果我这样做
printf("crypt => '%s'\n",crypt("Hello",'$6$CygnieHyitJoconf$'));
Run Code Online (Sandbox Code Playgroud)
我得到了一个无益的帮助
crypt => ''
Run Code Online (Sandbox Code Playgroud)
有没有办法在不使用glibc的盒子上获取Perl中的SHA-512密码哈希值?(这是我在大多数搜索时被告知的内容("使用地穴").
我真的不想在perl中重新实现SHA-512密码哈希.
谢谢!
我为我的应用程序处理身份验证组件.我正在使用带有盐渍密码的Apache Shiro API.
我在这个示例中使用salt创建了一个新用户:
ByteSource salt = randomNumberGenerator.nextBytes(32);
byte[] byteTabSalt = salt.getBytes();
String strSalt = byteArrayToHexString(byteTabSalt);
String hashedPasswordBase64 = new Sha256Hash(inPassword, salt, 512).toBase64();
Run Code Online (Sandbox Code Playgroud)
但我不明白我是如何在doGetAuthenticationInfo方法中使用salt来验证用户的.我的方法必须返回SaltedAuthenticatedInfo,但我不明白我是如何创建它的.
我不明白Credential Matcher和SaltedAuthenticateInfo之间的联系.
创建密码盐时,是否必须通知凭据匹配器?
谢谢你的帮助.
我想在我的一个C#.NET应用程序中加入和解密文件.场景很简单:用户A向用户B发送AES256加密文件.明文密码在不同的频道上交换(例如电话或其他).
根据我的理解,我应该使用Rfc2898DeriveBytes将用户的明文密码转换为更安全的密码,使用10,000轮.(见本文).
我不明白的是盐在我的场景中的作用.通常在散列密码中使用salt来防止字典攻击.但在我的场景中,PBKDF2算法用于通过添加PBKDF2轮次所需的额外计算来弥补短或易猜测明文密码的弱点.
如果我选择随机盐,那么接收器也需要知道盐,以便正确解密.如果我使用恒定盐,那么黑客可以轻松地对我的代码进行逆向工程并使用我的恒定盐运行暴力攻击(尽管由于PBKDF2迭代它们会非常慢).
根据我的理解,我别无选择,只能在我的场景中使用恒定的盐,并强制执行一个良好的明文密码规则来弥补恒定盐的弱点.我的假设是否正确?
使用bcryptPython 2.7,我可以看到该示例使用bcrypt.hashpw散列密码进行存储并验证给定的密码是否与散列密码相匹配,如下所示:
import bcrypt
password = b"somepassword"
hashed = bcrypt.hashpw(password, bcrypt.gensalt())
Run Code Online (Sandbox Code Playgroud)
好的,到目前为止一切顺利.现在使用bcrypt对给定的密码进行哈希处理,因此它是一个哈希字节的字符串.
现在,这是令我困惑的部分:要检查明文密码是否与哈希密码匹配,使用相同的函数,使用哈希密码作为salt:
if bcrypt.hashpw(password, hashed) == hashed:
print("It Matches!")
else:
print("It Does not Match :(")
Run Code Online (Sandbox Code Playgroud)
两种bcrypt.hashpw调用的结果不应该不同,因为输入盐是不同的吗?
我能想到的唯一合理的答案是,在将前缀添加到哈希密码之前,盐被截断为固定长度.这样一来,使用散列的结果时,仅将所生成的盐是左(剥离后散列密码后),和散列与截短的盐密码的结果是相同的原件.但是,我没有任何证据支持这一点.
为什么这样做?
我正在尝试在本地实现 Apache Solr 的基本身份验证。在Apache Solr Sample security.json 的屏幕截图(来源: https: //lucene.apache.org/solr/guide/7_2/basic-authentication-plugin.html#basic-authentication-plugin)中3,给出了A user called 'solr', with a password 'SolrRocks' has been defined.。此外,假定密码被添加为 sha256(密码+盐)哈希值。但盐没有在任何地方指定(据我检查)。
我需要盐才能为 security.json 创建新密码。盐在哪里指定?我尝试用谷歌搜索答案,但找不到任何东西。如果你能帮助我那就太好了。谢谢。
由于我不是密码学专家,我可能会遗漏一些东西。我所知道的是,盐是与密码连接的随机位,因此具有相同密码的人最终不会得到相同的哈希值(如果这些人的盐不同)。
更新
在这个链接中,作者描述了在Apache Solr文档中找不到加密方法的问题。他查看了Solr代码,发现Sha256AuthenticationProvider.java中的sha256()才是真正计算哈希的函数。
链接中还提供了可下载的 jar 文件,可用于生成 Apache Solr 所需的密码。
但我仍然对 Solr 如何匹配密码感到困惑。给定的 jar 文件在不同的运行中为相同的密码字符串提供不同的哈希值(因为它随机生成盐)。如果我将密码设置为fQfWaUyrgXoHPT9OiubY5zh8A4fL0D+r8592Eo1+Gbo= M7Vz0pRkjliKbPKHfP0qcMiALD16ujPQYPOu7SVG6Z8=(一次运行 jar 文件时获得的“SolrRocks”的加密版本),然后我尝试使用密码“SolrRocks”发送一个curl 请求,Solr 如何知道它是相同的密码?
如果有人能解释这一点那就太好了。谢谢。