Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Encryption 我应该使用Base64还是Unicode来存储哈希值&;盐?_Encryption_Unicode - Fatal编程技术网

Encryption 我应该使用Base64还是Unicode来存储哈希值&;盐?

Encryption 我应该使用Base64还是Unicode来存储哈希值&;盐?,encryption,unicode,Encryption,Unicode,我从未从事过网络应用的安全方面的工作,因为我刚从大学毕业。现在,我正在寻找一份工作,并在一些网站上兼职,以保持我的技能敏锐并获得新技能。我正在做的一个网站几乎是从创建它的人那里复制过来的,但我试图理解它,并尽我所能做得更好 为了计算hash和salt,创建者使用PBKDF2。我对听到支持或反对PBKDF2的论点不感兴趣,因为这不是这个问题的内容。他们似乎对这里的一切都使用了缓冲区,据我所知,这是节点中的常见做法。我感兴趣的是他们使用base64进行缓冲区编码的原因,而不是简单地使用UTF-8,后

我从未从事过网络应用的安全方面的工作,因为我刚从大学毕业。现在,我正在寻找一份工作,并在一些网站上兼职,以保持我的技能敏锐并获得新技能。我正在做的一个网站几乎是从创建它的人那里复制过来的,但我试图理解它,并尽我所能做得更好

为了计算hash和salt,创建者使用PBKDF2。我对听到支持或反对PBKDF2的论点不感兴趣,因为这不是这个问题的内容。他们似乎对这里的一切都使用了缓冲区,据我所知,这是
节点中的常见做法。我感兴趣的是他们使用
base64
进行缓冲区编码的原因,而不是简单地使用
UTF-8
,后者是缓冲区对象的一个选项。现在的大多数计算机可以处理许多Unicode字符,如果不是全部的话,但是创建者可以选择在Unicode的子集中编码密码,而不将自己限制在
base64
的65个字符内

所谓“选择编码方式为
UTF-8
base64
”,我的意思是将从密码计算的哈希二进制转换为给定编码
node.js
指定将二进制数据编码到缓冲区对象中的两种方法。从缓冲区类的文档页面:

Pure JavaScript is Unicode friendly but not nice to binary data. When dealing with TCP
streams or the file system, it's necessary to handle octet streams. Node has several
strategies for manipulating, creating, and consuming octet streams.

Raw data is stored in instances of the Buffer class. A Buffer is similar to an array
of integers but corresponds to a raw memory allocation outside the V8 heap. A Buffer
cannot be resized.
据我所知,缓冲区类的作用是获取一些二进制数据并计算每个8位(通常)的值。然后,它将每组位转换为与指定编码中的值对应的字符。例如,如果二进制数据是
00101100
(8位),并且指定
UTF-8
作为编码,则输出将是
(逗号)。这是任何查看缓冲区输出的人在使用文本编辑器(如
vim
)查看缓冲区时所看到的,也是计算机在“读取”缓冲区时所看到的。缓冲区类有几种可用编码,例如
UTF-8
base64
binary

我想他们觉得,当他们不得不在散列中存储任何可以想象到的
UTF-8
字符时,大多数现代计算机不会像他们在日志中可能想做的那样,使用千兆字节的RAM和兆字节的空间,实际显示所有这些字符,这会吓坏用户,谁会看到奇怪的中文、希腊文、保加利亚文等字符,以及控制字符,比如
Ctrl
按钮或
Backspace
按钮,甚至嘟嘟声。他们永远不需要真正理解其中任何一个,除非他们是测试PBKDF2本身的有经验的用户,但程序员的首要职责是不让他的任何用户心脏病发作。使用
base64
会增加大约三分之一的开销,这在现在几乎不值得注意,并且会减少字符集,这对降低安全性没有任何作用。毕竟,计算机完全是用二进制编写的。正如我之前所说的,他们本可以选择不同的Unicode子集,但是
base64
已经是标准的,这使得它更容易,并且减少了程序员的工作量


关于这个存储库的创建者选择将其密码编码为
base64
,而不是全部使用Unicode的原因,我说得对吗?还是继续使用Unicode或更大的子集更好?

哈希值是字节序列。这是二进制信息。它不是一个字符序列

UTF-8是一种将字符序列转换为字节序列的编码。将散列值存储为“UTF-8”毫无意义,因为它已经是一个字节序列,而不是一个字符序列


不幸的是,许多人已经习惯于将字节视为某种伪装的字符;它是C编程语言的基础,仍然影响着一些相当现代和广泛的框架,如Python。然而,这条道路上只有困惑和悲伤。通常的症状是人们对可怕的“字符零”(character zero)抱怨不已,也就是说,一个值为0的字节(对于一个字节来说是一个非常好的值)变成了一个字符,变成了一个特殊的字符,在C族语言中用作字符串结束指示器。这种混淆甚至会导致漏洞(对于比较函数,零意味着提前终止)

一旦你理解了二进制就是二进制,问题就变成了:我们如何处理和存储我们的散列值?特别是在JavaScript中,一种已知在处理二进制值方面特别差的语言。解决方案是一种编码,它将字节转换为字符,而不仅仅是任何字符,而是一小部分行为良好的字符。这就是所谓的。Base64是一种通用方案,用于将字节编码为不包含问题字符的字符串(无零,仅ASCII可打印字符,不包括所有控制字符和一些其他字符,如引号)


不使用Base64意味着假设JavaScript可以像管理“普通字符”一样管理任意字节序列,这根本不是真的。

存储为Base64而不是Unicode有一个基本的、与安全相关的原因:哈希可能包含字节值“0”,被许多编程语言用作字符串结束标记

如果将哈希存储为Unicode,则您、其他程序员或您使用的某些库代码可能会将其视为字符串而不是字节集合,并使用
strcmp()
或类似的字符串比较函数进行比较。如果您的散列包含字节值“0”,则实际上已将散列截断为“0”之前的部分,从而使攻击更加容易

Base64编码