我一直在四处寻找,我仍然不确定“盐”是什么,以及如何使用/实施它。 对不起,没有问题,我自学PHP。
我需要在postgresql上使用salt来encryption一些密码,而且我还没有find任何相关的文档来说明如何完成这些工作。 那么我怎样才能在PostgreSQL的哈希密码(与一些盐)?
假设您可以自由决定如何将密码散列存储在DBMS中。 这样的计划有明显的弱点吗? 要创build存储在DBMS中的散列值,请执行: 作为salt的一部分,DBMS服务器实例唯一的值, 而用户名作为盐的第二部分, 并创build盐与实际密码的连接, 并使用SHA-256algorithm对整个string进行散列, 并将结果存储在DBMS中。 这意味着任何想要碰撞的人都应该分别为每个用户名和每个DBMS服务器实例单独完成工作。 我打算保持实际的哈希机制有点灵活,以允许使用新的NIST标准哈希algorithm( SHA-3 ),仍然在工作。 “DBMS服务器实例独有的价值”不一定是秘密 – 尽pipe它不会随便泄露。 其目的是确保如果某人在不同的DBMS服务器实例中使用相同的密码,则logging的散列值将会不同。 同样,用户名也不是秘密 – 只是密码本身。 密码第一,用户名和“唯一值”第二,或三个数据源的其他排列是否有优势? 或者交叉string呢? 我是否需要添加(并logging)随机salt值(每个密码)以及上面的信息? (优点:用户可以重新使用密码,而且可能会在数据库中logging不同的哈希。缺点:必须logging盐,我认为这样做的好处远远大于缺点。 有相当多的相关SO问题 – 这个列表不太可能是全面的: 在数据库中encryption/散列纯文本密码 为PHP密码提供安全的哈希和盐 为了散列而隐藏盐的必要性 客户端MD5哈希与时间盐 简单的密码encryption 盐生成和开源软件 密码哈希值:固定长度的二进制字段还是单个string字段? 我认为这些问题的答案支持我的algorithm(尽pipe如果你只是使用随机盐,那么'每个服务器的唯一值'和用户名组件就不那么重要了。
这里是Java中的一个algorithm: 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); } 假定盐是已知的。 我想知道当密码是一个字典单词的时候,还有当它不是一个字典单词。
这段代码应该用一个盐来散列密码。 盐和哈希密码正在保存在数据库中。 密码本身不是。 鉴于手术的敏感性,我想确保一切都是洁净的。 注意:我习惯使用b64encode的url安全版本。 import hashlib import base64 import uuid password = 'test_password' salt = base64.urlsafe_b64encode(uuid.uuid4().bytes) t_sha = hashlib.sha512() t_sha.update(password+salt) hashed_password = base64.urlsafe_b64encode(t_sha.digest())
密码盐有没有对“salt”这个词有意义?
我想在我的login系统中实现一个salt,但是对于这个工作如何工作有些困惑。 我无法理解它背后的逻辑。 我知道md5是一种单向algorithm,我所遇到的所有function似乎都把所有东西都混合在一起。 如果是这样,那么如何取回密码进行比较呢? 我最大的问题是,如何腌制密码的用户密码比安全? 如果一个数据库被破坏,那么散列和salt一起就在数据库中。 这不是黑客所需要的吗? 另外还有一位开发者说: “确保你的盐和algorithm与数据库分开存储” 我想将salt存储在数据库中。 这真的是个问题吗? 我正在寻求一些帮助来理解这是如何工作的,以及最佳实践可能是什么。 任何帮助是极大的赞赏。 编辑:我想感谢大家的回应和想法。 即使我现在可能更困惑,对我来说,这确实是一个学习的经验。 再次感谢你们。
我正在看一些我自己写的代码。 代码尝试使用SHA512散列密码,并使用time()作为salt。 是time()太简单盐或为此代码安全吗? 感谢您的答复和评论。 我将在这里为新读者总结一下: 每个用户的盐应该是不同的,所以如果两个用户同时注册,他们的盐将不是唯一的。 这是一个问题,但不是一个大问题。 但盐不应该与用户有任何关系,所以time()不是一个好的盐。 “ 使用一种随机的,均匀分布的,高熵的盐。 ” – 这是一口,所以什么样的代码可能会产生一个random, evenly distributed, high entropy盐? 好的,那我怎么样用一个32字符长的随机stringreplacetime()。 随机string可以通过在一组字母字符上循环32次而生成。 这听起来不错吗?
我想使用has_secure_password在数据库中存储encryption的密码。 我无法在互联网上find如果has_secure_password使用任何forms的has_secure_password 。 如果它使用腌制,它是如何工作的? 任何人都可以为我澄清这一点? 泰斯
当腌制和散列用户密码时,任何盐都显然会有帮助。 盐应该有多长时间? 我将把salt存储在我的用户表中,所以我希望在存储大小和安全性之间取得最佳平衡。 是一个随机的10字符盐够了吗? 还是我需要更长的时间?