1

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

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

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

让我们假设散列键是 common_key = "mykey123"

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

我怎样才能做到这一点?

此外,我正在用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 脚本来使用散列算法重命名所有文件,因此任何有关此的代码都将非常有用。谢谢你。

4

3 回答 3

1

使用在 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";
于 2012-07-18T20:18:54.703 回答
0

您可能希望将其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');

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

于 2012-07-18T20:06:11.427 回答
0

尽管我接受了上述答案,但我最终还是使用了称为 crypto 的 node.js 模块进行散列。此外,我不得不稍微调整一下 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');
于 2012-07-18T22:14:01.227 回答