我发现哈希和加密算法之间存在很多混淆,我希望听到一些更专业的建议:
何时使用哈希与加密
什么使哈希或加密算法不同(从理论/数学水平) 即什么使得哈希不可逆转(没有彩虹树的帮助)
以下是一些类似的 SO问题,这些问题没有像我想要的那样详细:
What is the difference between Obfuscation, Hashing, and Encryption?
Difference between encryption and hashing
答案 0 :(得分:697)
答案 1 :(得分:155)
哈希函数可以被认为与烘焙一条面包相同。你从输入(面粉,水,酵母等......)开始,在应用哈希函数(混合+烘焙)之后,你得到一个输出:一条面包。
走另一条路是非常困难的 - 你不能把面包真的分成面粉,水,酵母 - 其中一些在烘焙过程中丢失了,你永远无法确切知道多少水或面粉或酵母用于特定的面包,因为该信息被散列函数(也称为烤箱)破坏。
理论上,许多不同的输入变体会产生相同的面包(例如2杯水和1汤匙酵母产生与2.1杯水和0.9tsbp酵母完全相同的面包),但是如果给出其中一个面包,你可以不知道输入的组合产生了什么。
另一方面,加密可以被视为一个保险箱。无论你放在哪里,只要你拥有它首先被锁定的钥匙就会回来。这是一个对称的操作。给定一个键和一些输入,您将获得一定的输出。给定输出和相同的键,您将获得原始输入。这是一个1:1的映射。
答案 2 :(得分:41)
当您不希望能够取回原始输入时使用哈希,请在使用加密时使用加密。
哈希采取一些输入并将其转换为某些位(通常被认为是一个数字,如32位整数,64位整数等)。相同的输入将始终产生相同的散列,但您在过程中主要丢失信息,因此您无法可靠地重现原始输入(但是有一些警告)。
加密主要保留您加入加密函数的所有信息,只是让任何人在没有特定密钥的情况下反向原始输入变得困难(理想情况下是不可能的)。
哈希的简单示例
这是一个简单的例子,可以帮助您理解为什么哈希不能(在一般情况下)取回原始输入。假设我正在创建一个1位哈希。我的散列函数将一个字符串作为输入,如果输入字符串中设置了偶数位,则将散列设置为1,否则如果存在奇数则为0。
示例:
Input Hash
0010 0
0011 1
0110 1
1000 0
请注意,有许多输入值导致散列为0,而许多导致散列为1.如果您知道散列为0,则无法确定原始输入是什么。< / p>
顺便说一句,这个1位哈希并不是完全人为的......看看parity bit。
加密的简单示例
您可以使用简单的字母替换来加密文本,例如,如果输入为A,则编写B.如果输入为B,则编写C.一直到字母表的末尾,如果输入是Z,你再写一次。
Input Encrypted
CAT DBU
ZOO APP
就像简单的哈希示例一样,这种加密方式有been used historically。
答案 3 :(得分:36)
散列和加密/解密技术的基本概述是。
<强>散列:强>
如果您再次哈希任何纯文本,无法获得相同的平原 散列文本中的文字。简单来说,这是一个单向的过程。
加密和解密:
如果您再次使用密钥加密任何纯文本,就可以 通过使用相同(symetric)/ diffrent(asymentric)键对加密文本执行解密,获得相同的纯文本。
<强>更新强> 解决编辑过的问题中提到的问题。
如果您想向某人发送文件,<强> 1。何时使用哈希与加密
哈希非常有用。但是你担心其他人可能会截取该文件并进行更改。那么一个 收件人可以确保它是正确的文件的方式是if 你公开发布哈希值。收件人可以这样计算 收到的文件的哈希值,并检查它是否与哈希匹配 值。
加密如果您要发送消息发送给某人,那就很好。您使用密钥加密邮件,收件人使用密钥解密 获取原始消息的相同(或者甚至可能是不同的)密钥。 credits
<强> 2。是什么使哈希或加密算法不同(从理论/数学水平),即什么使哈希不可逆 (没有彩虹树的帮助)
基本上哈希是一个 丢失信息但不加密的操作。我们来看看吧 简单数学方法的差异让我们易于理解, 当然两者都有更复杂的数学运算 涉及重复的重复
加密/解密(可逆):
添加:
4 + 3 = 7
这可以通过取总和并减去其中一个来反转 加数
7 - 3 = 4
<强>乘法强>:
4 * 5 = 20
这可以通过取出产品并除以其中一个来逆转 因子
20 / 4 = 5
所以,在这里我们可以假设其中一个加数/因子是decrpytion键,结果(7,20)是一个被删除的文本。
哈希(不可逆):
模块划分:
22 % 7 = 1
这是无法逆转的,因为您无法对商和被除数进行操作 重构除数(反之亦然)。
你能找到一个填写“?”的操作吗?是什么?
1 ? 7 = 22 1 ? 22 = 7
因此哈希函数具有与模除法相同的数学质量并且丢失信息。
答案 4 :(得分:25)
我的一个班轮......一般面试官想要以下答案。
哈希是一种方式。您无法从哈希码转换数据/字符串。加密是双向的 - 如果你有密钥,你可以再次解密加密的字符串。
答案 5 :(得分:15)
哈希函数将可变大小的文本数量转换为固定大小的文本。
来源:https://en.wikipedia.org/wiki/Hash_function
让我们看看它的实际效果。 我用它来做它。
HASH:
$str = 'My age is 29';
$hash = hash('sha1', $str);
echo $hash; // OUTPUT: 4d675d9fbefc74a38c89e005f9d776c75d92623e
DEHASH:
SHA1是单向哈希。这意味着您无法取消哈希值。但是,您可以强制执行哈希。请参阅:https://hashkiller.co.uk/sha1-decrypter.aspx。
MD5,是另一个哈希。可以在此网站上找到MD5 dehasher:https://www.md5online.org/。
加密功能使用加密密钥将文本转换为无意义的密文,反之亦然。
来源:https://en.wikipedia.org/wiki/Encryption
让我们深入研究一些处理加密的PHP代码。
--- Mcrypt extention ---
ENCRYPT:
$cipher = MCRYPT_RIJNDAEL_128;
$key = 'A_KEY';
$data = 'My age is 29';
$mode = MCRYPT_MODE_ECB;
$encryptedData = mcrypt_encrypt($cipher, $key , $data , $mode);
var_dump($encryptedData);
//OUTPUT:
string '„Ùòyªq³¿ì¼üÀpå' (length=16)
DECRYPT:
$decryptedData = mcrypt_decrypt($cipher, $key , $encryptedData, $mode);
$decryptedData = rtrim($decryptedData, "\0\4"); // Remove the nulls and EOTs at the END
var_dump($decryptedData);
//OUTPUT:
string 'My age is 29' (length=12)
--- OpenSSL扩展---
Mcrypt扩展在7.1中被弃用。并在PHP 7.2中删除。 应该在php 7中使用OpenSSL扩展。请参阅下面的代码片段:
$key = 'A_KEY';
$data = 'My age is 29';
// ENCRYPT
$encryptedData = openssl_encrypt($data , 'AES-128-CBC', $key, 0, 'IV_init_vector01');
var_dump($encryptedData);
// DECRYPT
$decryptedData = openssl_decrypt($encryptedData, 'AES-128-CBC', $key, 0, 'IV_init_vector01');
var_dump($decryptedData);
//OUTPUT
string '4RJ8+18YkEd7Xk+tAMLz5Q==' (length=24)
string 'My age is 29' (length=12)
答案 6 :(得分:9)
对称加密:
对称加密也可以称为共享密钥或共享密钥加密。在对称加密中,单个密钥用于加密和解密流量。
非对称加密:
非对称加密也称为公钥加密。非对称加密与对称加密的不同之处主要在于使用了两个密钥:一个用于加密,一个用于解密。最常见的非对称加密算法是RSA
。
与对称加密相比,非对称加密会带来很高的计算负担,并且往往会慢得多。因此,通常不用于保护有效载荷数据。相反,它的主要优势在于能够在非安全媒体(例如,互联网)上建立安全通道。这是通过交换公钥来实现的,公钥只能用于加密数据。永远不会共享的互补私钥用于解密。
<强>散列:强>
最后,散列是一种加密安全形式,与加密不同。加密是用于首先加密然后解密消息的两步过程,而散列将消息压缩为不可逆的固定长度值或散列。在网络中看到的两种最常见的哈希算法是MD5
和SHA-1
。
在此处阅读更多内容:http://packetlife.net/blog/2010/nov/23/symmetric-asymmetric-encryption-hashing/
答案 7 :(得分:4)
当您只需要单程时使用哈希。例如,对于系统中的密码,您使用散列,因为您只会验证用户在散列后输入的值是否与存储库中的值匹配。通过加密,您可以采用两种方式。
散列算法和加密算法只是数学算法。所以在这方面他们并没有什么不同 - 它只是数学公式。但语义学上,散列(单向)和加密(双向)之间存在很大的区别。为什么哈希不可逆转?因为它们的设计是这样的,因为有时你需要单向操作。
答案 8 :(得分:4)
当涉及到传输数据的安全性,即双向通信时,您使用加密。所有加密都需要密钥
在授权方面,您使用散列。散列中没有键
Hashing接收任意数量的数据(二进制或文本),并创建表示数据校验和的常量长度哈希。例如,散列可能是16个字节。不同的哈希算法产生不同大小的哈希值。您显然无法从散列重新创建原始数据,但您可以再次散列数据以查看是否生成了相同的散列值。单向基于Unix的密码以这种方式工作。密码存储为哈希值,要登录系统,您键入的密码将被哈希,并将哈希值与实际密码的哈希值进行比较。如果匹配,则必须输入正确的密码
为什么哈希不可逆转:
散列不可逆,因为输入到散列映射不是1对1。 将两个输入映射到相同的散列值通常称为“散列冲突”。出于安全考虑,“良好”散列函数的一个属性是碰撞在实际使用中很少见。
答案 9 :(得分:4)
加密和哈希算法以类似的方式工作。在每种情况下,都需要在这些位中创建confusion and diffusion。简而言之, confusion 正在创建密钥和密文之间的复杂关系, diffusion 正在传播每个位的信息。
许多哈希函数实际上使用加密算法(或加密算法的原语。例如,SHA-3候选Skein使用Threefish作为处理每个块的基础方法。区别在于不是保留每个块在密文中,它们是破坏性的,确定性地合并在一起的固定长度
答案 10 :(得分:1)
您已经得到了一些好的答案,但是我想您可能会看到这样的结果: 加密: 如果您拥有正确的密钥,则加密必须是可解密的。
示例: 就像您发送电子邮件时一样。 您可能不希望世界上的所有人都知道您正在向接收电子邮件的人写什么,但是接收电子邮件的人可能希望能够阅读它。
哈希: 散列的工作方式类似于加密,但是它根本不能将其反向。
示例: 就像您将钥匙放在锁着的门上时(关闭门时会锁的那种)一样。您不必担心锁的详细工作原理,只要您在使用钥匙时将其解锁即可。如果遇到麻烦,您可能无法修复它,而是获得一个新的锁(例如,每次登录时都忘记密码,至少我一直都这样做,这是使用哈希的常见区域)。
...在这种情况下,我想您可以将彩虹算法称为锁匠。
希望事情能解决=)
答案 11 :(得分:-3)
加密加密的目的是转换数据以保密.Eg(向某人发送他们应该只能阅读的秘密文本,通过互联网发送密码)。
不是关注可用性,而是确保数据发送可以分开发送,而且只能由您发送的用户看到。
它将数据加密成另一种格式,将其转换为唯一模式,可以使用密钥加密,具有密钥的用户可以通过可逆过程查看消息。 E.g(AES,河豚,RSA)
加密可能看起来像 FhQp6U4N28GITVGjdt37hZN
哈希从技术上讲,我们可以说它是一个仲裁输入并产生一个固定长度的字符串。
这些中最重要的是你不能从输出到输入。它会提供给定信息未被修改的强烈支持。 该过程是接收输入并对其进行哈希处理,然后一旦接收者收到它们就与发送者的私钥一起发送,他们可以使用发送者的公钥对其进行验证。
如果哈希错误并且与哈希匹配,我们无法看到任何信息。 E.g(MD5,SHA .....)
答案 12 :(得分:-3)
密码学处理数字和字符串。基本上,整个宇宙中的每个数字事物都是数字。当我说数字时,它的0和1。你知道它们是什么,二进制。您在屏幕上看到的图像,通过耳机收听的音乐以及所有内容都是二进制文件。但是我们的耳朵和眼睛不会理解二进制文件吗?只有大脑可以理解,即使可以理解二进制文件,也无法享受二进制文件。因此,我们将二进制文件转换为人类可以理解的格式,例如mp3,jpg等。我们将该过程称为编码。这是双向过程,可以轻松地解码回原始格式。
哈希
散列是另一种加密技术,其中数据一旦转换为其他形式,就永远无法恢复。用Layman的术语来说,没有称为去哈希的过程。有许多哈希函数可以完成工作,例如sha-512,md5等。
如果无法恢复原始值,那么我们将在哪里使用它?密码!为手机或PC设置密码时,会创建密码的哈希并将其存储在安全的地方。下次尝试登录时,将使用相同的算法(哈希函数)再次对输入的字符串进行哈希处理,并将输出与存储的值进行匹配。如果相同,则登录。否则,您将被丢弃。
信用:Wikimedia 通过对密码应用哈希,我们可以确保即使攻击者窃取了存储的密码文件,也永远不会获得我们的密码。攻击者将拥有密码的哈希值。他可能可以找到最常用的密码列表,然后对每个密码应用 sha-512 并将其与手中的值进行比较。这称为字典式攻击。但是他要这样做多久?如果您的密码足够随机,那么您认为这种破解方法可行吗? Facebook,Google和Amazon数据库中的所有密码都经过哈希处理,或者至少应该进行哈希处理。
然后是加密
加密位于散列和编码之间。编码是一种双向过程,不应用于提供安全性。加密也是一种双向过程,但是只有在知道加密密钥的情况下,才可以检索原始数据。如果您不知道加密的工作原理,请放心,我们将在此处讨论基础知识。这足以了解SSL的基础知识。因此,有两种加密类型,即对称加密和非对称加密。
对称密钥加密
我试图使事情尽可能简单。因此,让我们通过移位算法来了解对称加密。该算法用于通过将字母向左或向右移动来加密字母。让我们以字符串CRYPTO来考虑+3。然后,CRYPTO的加密格式将为FUBSWR。这意味着每个字母向右移3个位置。 在这里,单词CRYPTO被称为明文,输出FUBSWR被称为密文,值+3被称为 Encryption key (对称密钥),整个过程是一个密码。这是最古老且基本的对称密钥加密算法之一,在朱利叶斯·凯撒(Julius Caesar)时代曾首次报道其用法。因此,它以他的名字命名,并且是著名的 Caesar Cipher 。任何知道加密密钥并可以应用凯撒算法相反算法并检索原始纯文本的人。因此,它称为对称加密。
非对称密钥加密
我们知道,在对称加密中,相同的密钥用于加密和解密。一旦密钥被盗,所有数据都将消失。那是巨大的风险,我们需要更复杂的技术。 1976年,Whitfield Diffie和Martin Hellman首次发布了非对称加密的概念,该算法被称为 Diffie-Hellman密钥交换。然后在1978年,麻省理工学院的Ron Rivest,Adi Shamir和Leonard Adleman发布了 RSA 算法。这些可以被认为是非对称密码学的基础。
与对称加密相比,在非对称加密中,将有两个密钥而不是一个。一个称为公钥,另一个称为私钥。从理论上讲,在启动过程中,我们可以为计算机生成 Public-Private 密钥对。私钥应保存在安全的地方,并且绝不应该与任何人共享。顾名思义,公钥可以与希望向您发送加密文本的任何人共享。现在,拥有您的公共密钥的人可以使用它来加密秘密数据。如果密钥对是使用RSA算法生成的,则它们在加密数据时应使用相同的算法。通常,算法将在公钥中指定。加密的数据只能用您拥有的私钥解密。
来源:傻瓜的SSL / TLS第1部分:密码套件,哈希,加密| WST(https://www.wst.space/ssl-part1-ciphersuite-hashing-encryption/)