鉴于一次性打击垫是牢不可破的(据我所知,请随时纠正我),如果我要生成一个打击垫,并使用同样的精确打击垫加密用户的密码创建并将加密的密码存储在我的数据库中,这是一种安全的方法吗?换句话说,只要没有人看到垫子是什么就可以永久保持这个垫子吗?
我应该使用像mcrypt这样的东西吗?
答案 0 :(得分:3)
使用一次性密码时,您将使用加密密码。加密密码不是最佳的,因为无论如何,您都可以解密密码。您的应用程序本身必须能够访问密钥(或密钥,因为每个一次性密码只能加密一个密码),因此如果他有足够的权限,攻击者就可以访问。
这就是为什么我们使用哈希函数存储密码,它们是单向的,您可以检查输入的密码是否导致相同的哈希,但是您无法获得原始密码背部。 PHP提供函数password_hash()来生成这样的哈希值,它通过生成随机盐来处理所有陷阱,并使用缓慢的BCrypt来哈希密码。
答案 1 :(得分:1)
一次性页面中的“一次”意味着给定密钥仅用于加密单个明文。换句话说,您需要为每个需要加密的项目添加一个单独的填充。这就是让它们牢不可破的东西。由于这些单独的垫必须存放在某处,因此您很容易受到攻击。相反,使用广泛使用和测试的库(例如mcrypt)并使用salt加密密码