如何在数据库转储中替换电子邮件的安全性?

时间:2016-08-30 14:48:14

标签: bash perl

我已经掌握了这个命令。

perl -pe 's/(([A-z0-9_]|-|\+|\.)+)@([A-z0-9_]|\.|-)+\.[A-z0-9]+/"ss.some.email." . ++$n . "\@example.com"/eg' inputfile.sql > outfile.sql

但它可以打破序列化数据 - 字符串检查长度不匹配,因为现有的电子邮件将被另一个不同长度的随机电子邮件替换。

我想找到一些解决方案,可以用独特或至少随机的电子邮件替换电子邮件,但电子邮件字符串长度相同

$ cat inputfile.txt
john.doe@gmail.com too.long.email@hotmail.com

$ command_replace inputfile.txt
abc123abc12@aa.com abc123abc123abc123a@aa.com

2 个答案:

答案 0 :(得分:1)

如果你将Email::Find安装到你的perl,你可以像这样进行转换:

echo "john.doe@gmail.com too.long.email@hotmail.com" | \
perl -MEmail::Find -pe 'BEGIN{$junk="abc123"x100; $ef=Email::Find->new(sub { substr($junk,0,length $_[0]-7) . "@aa.com"})}; $ef->find(\$_)'

希望您的电子邮件都不超过607个字符。请注意,unicode或其他非ascii字符可能需要更多工作。

答案 1 :(得分:-1)

...最后

只是改变了一些原始命令......它有点复杂,但它有效。

而且速度太慢:对于数据库转储4GB大小的总时间差不多是10个小时。

perl -pe 's/(([A-z0-9_]|-|\+|\.)+)@(([A-z0-9_]|\.|-)+\.[A-z0-9]+)/(join("", map { (q(a)..q(z))[rand(26)] } 1..length($1))) . "@" . (join("", map { (q(a)..q(z))[rand(26)] } 1..length($3)-3)) . ".cc"/eg' path/to/file

问题的结果将是

vxtergkw@juagge.cc viufmhfnwvqubk@vzphosyz.cc

如果有人可以优化脚本的性能,我将非常感激。