Bash脚本和Javascript的标准哈希算法

Standard hashing algorithm for Bash script and Javascript?

本文关键字:标准 哈希 算法 Javascript 脚本 Bash      更新时间:2023-12-06

我的mac中有一个目录,其中有以下名称的文件-

Directory images -
1.jpg
2.jpg
3.jpg
4.jpg

我想写一个bash脚本,通过使用一些标准的哈希算法来重命名这个文件夹中的所有文件,这样目录现在看起来像这样-

假设散列密钥是common_key="mykey123"

Directory images -
U2FsdGVk.jpg
X1O9Z6e.jpg
ECdjybF.jpg
U2FsdGVajpg

我怎样才能做到这一点?

Furthur,我正在Nodejs(基本上是javascript)中编写一些代码,我希望从这四个图像中随机选择一个图像并显示它,所以我使用-

var random_image_number = Math.floor((Math.random()*4)+1); // Picking a random number out of 4

假设random_image为3。现在我需要显示图像编号3。如果我没有对图像名称进行散列,我通常会这样做——

<img src="/images/" + random_image_number + ".jpg" />

但现在我需要对我生成的随机数再次使用标准加密算法,然后才能显示图像。(我一直强调"标准",因为相同的哈希算法必须在JS端和bash脚本中工作,并生成相同的结果)

所以我需要一些类似的东西

var random_image_number = Math.floor((Math.random()*4)+1); // Picking a random number out of 4
var random_image_number_hashed = some_hashing_function(common_key, random_image_number)
<img src="/images/" + random_image_number_hashed + ".jpg" />

请告诉我可以使用什么算法。它不需要太复杂,但必须在bash脚本和javascript端给出相同的结果。

此外,我不知道如何编写bash脚本来使用哈希算法重命名所有文件,因此任何与此相关的代码都非常有用。非常感谢。

在javascript端使用openssl重命名文件和crypto.js,您应该能够使用SHA1对文件名进行哈希。

下面的bash循环将进行重命名。请注意,它假定文件名中没有空格字符。

for file in `/bin/ls *.jpg`; do
    hashedFileName=`echo -n ${file%.*} | openssl dgst -sha1 -hmac "myKey123"`;
    mv $file $hashedFileName.jpg;
done

对于每个图像名称,Javascript端看起来如下所示:

// hash filename "1.jpg":
var hashedFileName = CryptoJS.HmacSHA1("1", "myKey123") + ".jpg";

您可能希望将aes256作为您的算法。

在命令行上,您可以使用openssl实用程序加密文件名:

echo 'filename_to_encrypt' | openssl aes-256-cbc -a

然后在node中,您可以使用crypto模块解密:

var crypto = require('crypto');
var algorithm = 'aes256'; // or any other algorithm supported by OpenSSL
var key = 'password';
var text = 'encrypted_filename';
var decipher = crypto.createDecipher(algorithm, key);
var decrypted = decipher.update(text, 'hex', 'utf8') + decipher.final('utf8');

如果你只是想做散列,那么你可以使用bcryptbcrypt是一个在bash中工作的实用程序,它也有node.js模块。

尽管我接受了上面的答案,但我最终还是使用了node.js模块crypto进行哈希。此外,我不得不对bash脚本进行一些调整,使其能够工作。

这就是我最终使用的

Bash脚本(在图像文件夹中运行)-

for file in `/bin/ls *.jpg`; do
    hashedFileName=`echo -n ${file%.*} | openssl dgst -sha1 -hmac "myKey123"`;
    mv $file ${hashedFileName##* }.jpg;
done

NodeJs-

var crypto = require('crypto');
...
random_image_number_hashed = crypto.createHmac('sha1', 'myKey123').update(random_image_number).digest('hex');