2013-07-19 73 views
1

我正在使用crypto模块来创建salt和哈希以存储在我的数据库中。我正在使用SHA-512,如果这是相关的。从node.js插入二进制到MySQL

我有一个64字节的盐,目前以“SlowBuffer”的形式,由crypto.randomBytes(64, . . .)创建。例如:

<SlowBuffer 91 0d e9 23 c0 8e 8c 32 5c d6 0b 1e 2c f0 30 0c 17 95 5c c3 95 41 fd 1e e7 6f 6e f0 19 b6 34 1a d0 51 d3 b2 8d 32 2d b8 cd be c8 92 e3 e5 48 93 f6 a7 81 ...>

我也有一个64字节的哈希是当前的字符串。例如:

'de4c2ff99fb34242646a324885db79ca9ef82a5f4b36c657b83ecf6931c008de87b6daf99a1c46336f36687d0ab1fc9b91f5bc07e7c3913bec3844993fd2fbad'

在我的数据库,我有两个字段,称为passhash和passsalt,这是binary(64)秒。

我正在使用mysql模块(require('mysql'))添加该行。如何包含二进制文件以便插入?

+0

为什么不将二进制数据作为字符串存储在十六进制或Base64中? – rossum

+0

数据效率。这并不是什么重要的事情,但我觉得避免使用效率低下的数据结构是最好的做法。 –

回答

3

首先,我不再使用mysql模块,而是使用mysql2模块(因为它支持预准备语句)。这个问题几乎没有改变,但我想提一下,阅读这些使用'mysql'的人应该使用'mysql2'。

其次,这两个模块都可以将缓冲区作为这些字段的参数。这工作完美。做我本来试图做的,我有这样的:

var hash; //Pretend initialized as a 64-bit buffer 
var salt; //" " 

connection.query('insert into users set?', {..., passhash: hash, passsalt: salt,..., callback}); 

此外,我并没有意识到加密“消化”功能必须不带参数,这是因为返回的默认行为一个缓冲区。

这不是最好的措辞答案,但那是因为似乎没有人关注这个问题,这是我的问题。 :)如果你想要更多的澄清,随时发表评论。