威尼斯wns.9778官网 > 计算机教程 > Shell中建立与使用临时性文件的方法详解【威尼斯

原标题:Shell中建立与使用临时性文件的方法详解【威尼斯

浏览次数:183 时间:2019-06-14

处理此类安全性议题时,文件名必须是不可预知的。BSD与GUN/Linux系统都提供了mktemp命令,供用户建立难以猜测的临时性文件名称。虽然底层的mktemp()函数库调用已由POSIX标准化,但mktemp命令却没有。如果你的系统没有mktemp,我们建议你安装OpenBSD的可移植版本

2.   /dev/random和/dev/random的其他用途

1.  这两个伪设备可用于代替mktemp产生随机临时文件名:

cat /dev/urandom |od –x | tr –d  ' '| head –n 1

可以产生128位(bit)的临时文件名,具有较高的随机性和安全性。

2.  可以模拟生成SSH-keygen生成的footprint,脚本如下:

威尼斯wns.9778官网 1

 1 #/bin/sh -
 2 cat /dev/urandom |
 3 od -x |
 4 head -n 1|
 5 cut -d ' ' -f 2- |
 6 awk -v ORS=":" 
 7 '{
 8     for(i=1; i<=NF; i  ){
 9         if(i == NF){
10             ORS = "n";
11         }
12         print substr($i,1,2) ":" substr($i,3,2);
13     }
14 }'

威尼斯wns.9778官网 2

对该脚本的简单解释:

(1).  cat /dev/urandom | od -x  | head -n 1 用于从随机设备中读取一行数据流并转换为16进制。该段的输出类似于:

威尼斯wns.9778官网 3

(2).  由于第一列实际上是数据的偏移量,并不是随机数据流,再次用cut取出后面的几个字段:cut -d'' -f2-

(3).  利用awk程序输出。ORS是awk的内置变量,指输出记录分割符,默认为n。

脚本的输出结果:

 

对比用ssh-keygen生成的footprint,是不是挺像的? :D

http://blog.csdn.net/ohmygirl/article/details/40385083

 

您可能感兴趣的文章:

1.  基本介绍  

  /dev/random和/dev/urandom是Linux系统中提供的随机伪设备,这两个设备的任务,是提供永不为空的随机字节数据流。很多解密程序与安全应用程序(如SSH Keys,SSL Keys等)需要它们提供的随机数据流。

  这两个设备的差异在于:/dev/random的random pool依赖于系统中断,因此在系统的中断数不足时,/dev/random设备会一直封锁,尝试读取的进程就会进入等待状态,直到系统的中断数充分够用, /dev/random设备可以保证数据的随机性。/dev/urandom不依赖系统的中断,也就不会造成进程忙等待,但是数据的随机性也不高。

  使用cat 命令可以读取/dev/random 和/dev/urandom的数据流(二进制数据流,很难阅读),可以用od命令转换为十六进制后查看:

威尼斯wns.9778官网 4

威尼斯wns.9778官网 5

在cat的过程中发现,/dev/random产生的速度比较慢,有时候还会出现较大的停顿,而/dev/urandom的产生速度很快,基本没有任何停顿。

而使用dd命令从这些设备中copy数据流,发现速度差异很大:

从/dev/random中读取1KB的字节流:

威尼斯wns.9778官网 6

从/dev/urandom 中读取1KB的字节流:

威尼斯wns.9778官网 7

通过程序测试也发现:/dev/random设备被读取的越多,它的响应越慢.

使用PHP的加密扩展mcrypt时,mcrypt_create_iv()函数用于从随机源创建初始向量(initialization vector),该函数的签名为:

string mcrypt_create_iv ( int $size [, int $source = MCRYPT_DEV_URANDOM ] )

注意函数的第二个参数$source,在PHP 5.6.0以下的版本中,该参数默认是  MCRYPT_DEV_RANDOM,也就是说,mcrypt_create_iv默认从/dev/random设备获取随机数据源的。这在系统并发数较高时,系统无法提供足够的中断数,会导致访问进程挂起(锁住),从而无法正常响应。

一个简单的测试脚本如下:

威尼斯wns.9778官网 8

1 <?php
2 define("MCRYPT_KEY","x90!-=zo2s");
3 $src = "test";
4 
5 $size = mcrypt_get_iv_size(MCRYPT_BLOWFISH,MCRYPT_MODE_ECB);
6 $iv = mcrypt_create_iv($size);
7 $encrypted = mcrypt_ecb(MCRYPT_BLOWFISH, MCRYPT_KEY, $src, MCRYPT_DECRYPT, $iv);//5.5 已废弃,请使用最新的API测试

威尼斯wns.9778官网 9

我们之前在cat /dev/random的输出时已经发现,输出的随机数据流会出现较大的停顿。在并发数较大时,会造成读取进程的等待甚至无法响应。

幸好,我们可以指定第二个参数为MCRYPT_DEV_URANDOM使其强制使用/dev/urandom设备的随机数据流(PHP 5.6.0 版本中,已经默认使用/dev/urandom作为随机数据源)。

前言

/dev/random与/dev/urandom特殊文件

因为/tmp目录使用频繁,有些系统就会将它放在常驻内存型的文件系统里,以便快速访问,如下面这个例子:

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

$ TMPFILE=/tmp/secret.$(cat /dev/urandom | od -x | tr -d ' ' | head -n 1) 
$ echo $TMPFILE 
/tmp/secret.00000003ba2c845df949a7535088c8805479fdf 

在我们日常开发中经常会需要用到临时文件,本文就给大家介绍了关于Shell建立与使用临时性文件的相关内容,分享出来供大家参考学习,话不多说了,来一起看看详细的介绍:

此处,我们从/dev/urandom读取二进制字节数据流,以od将其转换为十六进制,使用tr去掉空格,之后满一行时停止。因为od将每个输出行转换为16个字节,因而提供了16 * 8 = 128个随机位,或是2的128次方,种可能的副文件名。如果该文件名建立在仅用户可列出的目录中,则攻击者无从猜测!

为避免在程序里将目录名称直接编码,可使用-t选项: 让mktemp使用环境变量TMPDIR所指定的目录或/tmp, -d选项要求建立临时性目录:

umask 077       # 删除用户以外其他人的所有访问权 
TMPFILE=${TMPDIR-/tmp}/myprog.$$ # 产生临时性文件名 
trap 'rm -f $TMPFILE' EXIT   # 完成时删除临时性文件  

这两个伪设备都可以取代mktemp,成为产生难以推测的临时性文件名的替代方案:

# TMPFILE=`mktemp /tmp/myprog.XXXXXXXXXXXX` || exit 1    # 建立唯一的临时性文件 
# ls -l $TMPFILE             # 列出临时性文件 
-rw------- 1 root root 0 8月 28 18:57 /tmp/myprog.yW0oosXxljx5 

有些系统会提供两种随机伪设备:/dev/random与/dev/urandom。现在这些仅在BSD系统、GUN/linux、IBM AIX 5.2、Mac OS X与Sun Solaris 9, 搭配两个第三方的实例与早期Solaris版本的计算修整程序上,提供此支持。这些设备的任务,是提供永不为空的随机字节数据流:这样的数据来源是许多加密程序与安全应用程序所需要的。虽然已经有很多的简单算法可以产生这种虚拟随机数据流,但其实要产生一个真正的随机数据其实是很难的事。

root@localhost:~/training# df /tmp 
Filesystem     1K-blocks  Used Available Use% Mounted on 
swap      568048704 10772216 528398256 2% /tmp 

进程编号在文件名尾号可以看出,但根本无法预测。当临时性文件无法建立或没有mktemp可用时,条件式exit命令可确保马上终止程序并带出错误输出。

本文由威尼斯wns.9778官网发布于计算机教程,转载请注明出处:Shell中建立与使用临时性文件的方法详解【威尼斯

关键词:

上一篇:深入浅析Python中的yield关键字,pythonyield威尼斯

下一篇:Linux Shell系列教程之(六)Shell数组,shell数组