最近我一直试图在我在互联网上偶然发现的登录脚本中实现我自己的安全性.在努力学习如何制作我自己的脚本为每个用户生成一个盐之后,我偶然发现了password_hash.
根据我的理解(基于本页的阅读:http://php.net/manual/en/faq.passwords.php),当您使用password_hash时,已经在行中生成了salt.这是真的?
我的另一个问题是,含有2种盐是不是很聪明?一个直接在文件中,一个在DB中?这样,如果有人在数据库中泄露了你的盐,你仍然直接在文件中?我在这里读到,存储盐绝不是一个明智的想法,但它总是让我困惑的是人们的意思.
据我了解,生成盐的最佳做法是使用源代码中存储的一些神秘公式(甚至魔术常量).
我正在研究一个我们打算作为开源发布的项目,但问题是源代码是生成盐的秘密公式,因此能够在我们的网站上运行彩虹表攻击.
我认为很多人在我面前都考虑过这个问题,我想知道最佳做法是什么.在我看来,如果代码是开源的话,根本就没有盐,因为盐可以很容易地进行逆向工程.
思考?
我想用来has_secure_password在数据库中存储加密的密码.如果has_secure_password使用任何形式的腌制,我在互联网上找不到.如果它使用盐腌,它是如何工作的?谁能为我澄清一下这个?
泰斯
我正在看一些我自己没有写过的代码.代码尝试使用SHA512散列密码并仅使用time()盐作为密码.是time()太简单盐这或者是这个代码安全吗?
感谢您的回答和评论.我将在此为新读者总结一下:
random, evenly distributed, high entropy盐?好吧,那么我用随机字符串32 char long替换time()怎么样.可以通过在一组字母表字符上循环32次来生成随机字符串.听起来不错吗?
我想在我的登录系统中实现一个盐,但我对它应该如何工作有点困惑.我无法理解它背后的逻辑.我理解md5是一种单向算法,我遇到的所有函数似乎都将所有内容混合在一起.如果是这种情况,如何获取密码进行比较?我最大的问题是,如何使用户密码更加安全,而不仅仅是对密码进行哈希处理?如果数据库曾被泄露,则散列与salt一起位于数据库中.这不是黑客所需要的吗?
我还在SO上发现了另一篇文章,其他开发人员说:
"确保您的salt和算法与数据库分开存储"
我想将salt存储在数据库中.如果我这样做,这真的是一个问题吗?
我正在寻求一些帮助,以了解它是如何工作的,以及最佳实践可能是什么.任何帮助是极大的赞赏.
编辑:我要感谢大家的回应和想法.尽管我现在可能更加困惑,但对我来说这肯定是一种学习经历.再次感谢你们.
这是Java中的算法:
public String getHash(String password, String salt) throws Exception {
String input = password + salt;
MessageDigest md = MessageDigest.getInstance(SHA-512);
byte[] out = md.digest(input.getBytes());
return HexEncoder.toHex(out);
}
Run Code Online (Sandbox Code Playgroud)
假设盐是已知的.我想知道在密码是字典单词时以及它不是字典单词时暴力的时间.
是否有一个教程或有没有人指出如何使用Spring-Security执行以下操作?
任务:
我需要从我的数据库中获取用于验证用户名的salt并使用它来加密提供的密码(从登录页面)以将其与存储的加密密码(也称为用户验证)进行比较.
附加信息:
我使用自定义数据库结构.一个UserDetails对象是通过自定义创建UserDetailsService这反过来使用自定义DAOProvider来从数据库中获取信息.
我的security.xml文件到目前为止:
<authentication-manager>
<authentication-provider user-service-ref="userDetailsService">
</authentication-provider>
</authentication-manager>
Run Code Online (Sandbox Code Playgroud)
现在我想我需要
<password-encoder hash="sha" />
Run Code Online (Sandbox Code Playgroud)
还有什么?如何告诉spring security使用databaseprovided salt来编码密码?
编辑:
我发现这个SO帖子是信息性的,但还不够:如果我在我的xml中定义一个盐源来供密码编码器使用,如下所示:
<password-encoder ref="passwordEncoder">
<salt-source ref="saltSource"/>
</password-encoder>
Run Code Online (Sandbox Code Playgroud)
我将不得不编写一个自定义SaltSource来使用我的自定义盐.但是在UserDetails对象内部找不到.所以...
备选方案1:
我可以使用可能具有salt属性的UserDetails的自定义实现吗?
<beans:bean id="saltSource" class="path.to.MySaltSource"
p:userPropertyToUse="salt"/>
Run Code Online (Sandbox Code Playgroud)
和
@Service("userDetailsService")
public class UserDetailsServiceImpl implements UserDetailsService {
public UserDetails loadUserByUsername(String username)
throws UsernameNotFoundException, DataAccessException {
// ...
return buildUserFromAccount(account);
}
@Transactional(readOnly = true)
UserDetailsImpl buildUserFromAccount(Account account){
// ... build User object that contains salt property
} …Run Code Online (Sandbox Code Playgroud) 我需要在postgresql上使用salt散列一些密码,而且我无法找到有关如何完成这些操作的任何相关文档.
那么如何在postgresql中散列密码(带有一些盐)呢?
我一直在寻找,我仍然不确定"盐"是什么以及如何使用/实施它.抱歉,这是一个noobish问题,我是自学php.
salt ×10
hash ×4
passwords ×4
security ×4
php ×3
cryptography ×2
encryption ×2
brute-force ×1
open-source ×1
postgresql ×1
rainbowtable ×1
sha ×1