目前对这个问题的最高投票表明:
另一个不是安全问题的安全问题虽然与安全相关,但却是完整的,并且很难解决散列密码和加密密码之间的区别.最常见于代码中的程序员试图提供不安全的"提醒我密码"功能.
究竟是什么区别?我总是认为哈希是一种加密形式.海报所指的不安全功能是什么?
散列是单向函数(嗯,映射).这是不可逆转的,你应用安全哈希算法,你不能得到原来的字符串.你能做的最多就是生成所谓的"碰撞",即找到一个提供相同散列的不同字符串.密码安全散列算法旨在防止冲突的发生.您可以通过使用彩虹表来攻击安全散列,您可以通过在存储之前对散列应用盐来抵消.
加密是一种正确的(双向)功能.它是可逆的,如果你有密钥,你可以解密受损的字符串以获得原始字符串.
它所指的不安全功能是,如果您加密密码,您的应用程序将密钥存储在某个地方,并且访问您的数据库(和/或代码)的攻击者可以通过获取密钥和加密文本来获取原始密码而使用哈希是不可能的.
人们通常会说,如果一个饼干拥有你的数据库或你的代码,他不需要密码,因此差异没有实际意义.这是天真的,因为您仍然有责任保护用户的密码,主要是因为他们中的大多数密码一次又一次地使用相同的密码,通过泄露密码使他们面临更大的风险.
散列是一个单向函数,这意味着一旦你散列密码,这是非常难以得到原来的密码从哈希回来.加密是一种双向功能,从加密文本中获取原始文本要容易得多.
使用字典攻击很容易打败普通哈希,攻击者只是预先挖掘字典中的每个单词(或每个字符组合达到一定长度),然后使用这个新字典查找散列密码.对存储的每个散列密码使用唯一的随机盐会使攻击者更难以使用此方法.他们基本上需要为你使用的每个盐值创建一个新的独特字典,从而减慢他们的攻击速度.
使用加密算法存储密码是不安全的,因为如果用户或管理员更容易从加密文本中恢复原始密码,攻击者也更容易做到这一点.
如上图所示,如果密码是加密的,则始终是隐藏的秘密,有人可以提取纯文本密码.但是,当对密码进行哈希处理时,您很放松,因为几乎没有任何方法可以从哈希值中恢复密码.
从加密密码和哈希密码中提取- 哪个更好?
纯文本密码可以使用DES,AES等对称加密算法或任何其他算法加密,并存储在数据库中.在验证(用用户名和密码确认身份)时,应用程序将解密存储在数据库中的加密密码,并与用户提供的密码进行比较以确保相等.在这种类型的密码处理方法中,即使有人访问数据库表,密码也不会简单地重复使用.然而,这种方法也有一个坏消息.如果有人获得加密算法以及应用程序使用的密钥,他/她将能够通过解密查看存储在数据库中的所有用户密码."这是我得到的最佳选择",软件开发人员可能会尖叫,但有更好的方法吗?
是的,可能你错过了这里的观点.您是否注意到没有要求解密和比较?如果存在单向转换方法,其中密码可以转换为某些转换字,但是反向操作(从转换字生成密码)是不可能的.现在,即使有人访问数据库,也无法使用转换后的单词复制或提取密码.在这种方法中,几乎没有人会知道你的用户的最高机密密码; 这将保护用户在多个应用程序中使用相同的密码.这种方法可以使用哪些算法?
我一直认为加密可以通过两种方式进行转换,最终值可以使您达到原始值,而使用哈希,您将无法从最终结果恢复为原始值.
散列算法本质上通常是加密算法,但主要区别在于加密通过解密是可逆的,而散列则不是.
加密函数通常接受输入并产生相同或稍大的加密输出.
散列函数接收输入并产生通常较小的输出,通常也具有固定大小.
虽然不可能采用散列结果并"取消"它以取回原始输入,但您通常可以通过强制方式获得产生相同散列的内容.
换句话说,如果身份验证方案获取密码,对其进行哈希处理,并将其与需要密码的哈希版本进行比较,则可能不需要您实际知道原始密码,只需要其哈希值,并且您可以强制使用你的方式将匹配,即使它是一个不同的密码.
通常创建散列函数以最小化冲突的可能性并且使得难以仅计算将产生与其他东西相同的散列的东西.