首页 > 编程技术 > php

openssl使用DSA算法生成签名实例详解

发布时间:2016-11-25 15:22

文章给大家介绍基于openssl使用DSA算法生成签名实例,生成签名方法很简单,我们需要懂得中间的原理就比较复杂了,大家一起来看看吧。

命令:

openssl> dgst -dss1 -sign C.pri -out signature.bin s.txt

解释
C.pri是DSA算法生成的私钥文件
s.txt是制作签名的原文
signature.bin是生成的签名文件

php中可以使用下面的方法察看签名内容

 代码如下 复制代码
<?php
echo bin2hex(file_get_contents('signature.bin'));
?>

参考内容
消息摘要算法
支持的算法包括:MD2, MD4, MD5, MDC2, SHA1(有时候叫做DSS1), RIPEMD-160。SHA1和RIPEMD-160产生160位哈西值,其他的产生128位。除非出于兼容性考虑,否则推荐使用SHA1或者RIPEMD-160。
除了RIPEMD-160需要用rmd160命令外,其他的算法都可用dgst命令来执行。
OpenSSL对于SHA1的处理有点奇怪,有时候必须把它称作DSS1来引用。
消息摘要算法除了可计算哈西值,还可用于签名和验证签名。签名的时候,对于DSA生成的私匙必须要和DSS1(即SHA1)搭配。而对于RSA生成的私匙,任何消息摘要算法都可使用。

# 消息摘要算法应用例子
# 用SHA1算法计算文件file.txt的哈西值,输出到stdout
$ openssl dgst -sha1 file.txt
# 用SHA1算法计算文件file.txt的哈西值,输出到文件digest.txt
$ openssl sha1 -out digest.txt file.txt
# 用DSS1(SHA1)算法为文件file.txt签名,输出到文件dsasign.bin
# 签名的private key必须为DSA算法产生的,保存在文件dsakey.pem中
$ openssl dgst -dss1 -sign dsakey.pem -out dsasign.bin file.txt
# 用dss1算法验证file.txt的数字签名dsasign.bin,
# 验证的private key为DSA算法产生的文件dsakey.pem
$ openssl dgst -dss1 -prverify dsakey.pem -signature dsasign.bin file.txt
# 用sha1算法为文件file.txt签名,输出到文件rsasign.bin
# 签名的private key为RSA算法产生的文件rsaprivate.pem
$ openssl sha1 -sign rsaprivate.pem -out rsasign.bin file.txt
# 用sha1算法验证file.txt的数字签名rsasign.bin,
# 验证的public key为RSA算法生成的rsapublic.pem
$ openssl sha1 -verify rsapublic.pem -signature rsasign.bin file.txt

下面我们一起来看看关于php 使用openssl_verify验证签名实例程序,希望本文章对各位同学会有所帮助。
 代码如下 复制代码


<?php
/**
 
* 验证签名
 
* TobeVerified 待验证签名的密文
 
* PlainText 待验证签名的明文
 
* CertFile 签名者公钥证书
 
* return 验证成功返回true,失败返回false(从LastErrMsg属性获取失败原因)
 
*/
function VerifyMsg($TobeVerified, $PlainText, $CertFile,$signature_alg=OPENSSL_ALGO_SHA1)
{
 
   
//用公钥验签
    $fp=fopen($CertFile,"r");
    if(!$fp)
    {
       
//echo "Error Number:-10005, Error Description: ER_FIND_CERT_FAILED(找不到证书)";
        return false;
    }
    $pub_key=fread($fp,8192);
    fclose($fp);
    $res = openssl_get_publickey($pub_key);
    if (1==openssl_verify($PlainText,pack("H" . strlen($TobeVerified), $TobeVerified) , $res,$signature_alg))
    {
       
//print("www.111cn.net提示您:验证成功"." <br>");
        return true;
    }
    else
    {
       
//echo "Error Number:-10021, Error Description: ER_VERIFY_ERROR(验签失败)|".openssl_error_string();
        return false;
    }
 
}
 
?>

openssl_verify 可能有三个返回值1,0,-1,只有返回1表示验证签名成功。

$signature_alg 默认OPENSSL_ALGO_SHA1 ,如果是DSA加密要设置成OPENSSL_ALGO_DSS1

uuid是什么格式的字符串我想很多朋友不知道,但是你己经来了估计就清楚什么是uuid了,下面我们一起来看看如何生成uuid字符串吧。

UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。通常平台会提供生成UUID的API。UUID按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。由以下几部分的组合:当前日期和时间(UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同),时钟序列,全局唯一的IEEE机器识别号(如果有网卡,从网卡获得,没有网卡以其他方式获得),UUID的唯一缺陷在于生成的结果串会比较长。关于UUID这个标准使用最普遍的是微软的GUID(Globals Unique Identifiers)。
在ColdFusion中可以用CreateUUID()函数很简单的生成UUID,其格式为:xxxxxxxx-xxxx-xxxx- xxxxxxxxxxxxxxxx(8-4-4-16),其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字。而标准的UUID格式为:xxxxxxxx-xxxx-xxxx-xxxxxx-xxxxxxxxxx (8-4-4-4-12)

 代码如下 复制代码

<?php
function guid(){
    if (function_exists('com_create_guid')){
        return com_create_guid();
    }else{
        mt_srand((double)microtime()*10000);
//optional for php 4.2.0 and up.
        $charid = strtoupper(md5(uniqid(rand(), true)));
        $hyphen = chr(45);
// "-"
        $uuid = chr(123)
// "{"
                .substr($charid, 0, 8).$hyphen
                .substr($charid, 8, 4).$hyphen
                .substr($charid,12, 4).$hyphen
                .substr($charid,16, 4).$hyphen
                .substr($charid,20,12)
                .chr(125);
// "}"
        return $uuid;
    }
}
?>

内容过滤多是为了防止一些安全注入或者是跨域操作了,下面我们一起来看看我整理的几个简单的防注入内容过滤程序代码,希望文章对各位同学会有所帮助。

方法一,过滤一些没用的内容

过滤没用的信息比较严格,有用的可能也输入不进去,可以从网上找找其他的过滤方法:

 代码如下 复制代码

function checkHtml($data){
  $ret  = preg_match("/['.,:;*?~`!@#$%^&+=)(<>{}]|]|[|/|\|"||/",$data);
  if ($ret == 1) {
    return false; exit;
  } else {
    return true;
  }
}

例2 过滤一些html标签了

 代码如下 复制代码


function uh($str)
{
$farr = array(
"/s+/", //过滤多余的空白
"/<(/?)(scripti?framestylehtmlbodytitlelinkmeta?%)([^>]*?)>/isU", //过滤 <script 等可能引入恶意内容或恶意改变显示布局的代码,如果不需要插入flash等,还可以加入<object的过滤
"/(<[^>]*)on[a-zA-Z]+s*=([^>]*>)/isU", //过滤javascript的on事件
);
$tarr = array(
" ",
"<\1\2\3>", //如果要直接清除不安全的标签,这里可以留空
"\1\2",
);
$str = preg_replace( $farr,$tarr,$str);
return $str;
}

方法三,上面两种方法都是把要过滤内容放在了程序中,下面我把要过滤的内容放到一个txt文本只,第次只要读文件内容进行判断即可,这样方便维护要过滤的内容。

 代码如下 复制代码

<?php
if($_POST)
{
 //获取文件内容转为数组两种方法:
 /*
 $fcon = file_get_contents("./filter.txt");
 $filter_word = explode("n",$fcon);
 */
 $filter_word = file("./filter.txt");
 //$filter_word = array("test1","test2","test3","test4");
 $str = $_POST["mess"];
 for($i=0;$i<count($filter_word);$i++)
 {
  if(preg_match("/".(trim($filter_word[$i]))."/i",$str))
  {
   echo "<script>alert('您输入的内容含非法内容,请重输!');</script>";
   echo "<a href='index.php'>返回</a>";
   exit;
  }
 }
 echo "您输入的内容是:".$str;
}
?>
<h2>测试过滤是否生效:</h2>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<p><textarea name="mess" cols="40" rows="4"></textarea></p>
<p><input type="submit" name="sub" value="send"></p>
</form>

php生成一个随机的密码,方便快捷,可以随机生成安全可靠的密码,希望此文章对大家会有所帮助。

 代码如下 复制代码

<?php

header("Content-type:text/html;charset=utf-8");

function getRandPass($length = 6){

 $password = '';

 //将你想要的字符添加到下面字符串中,默认是数字0-9和26个英文字母

 $chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

 $char_len = strlen($chars);

 for($i=0;$i<$length;$i++){

  $loop = mt_rand(0, ($char_len-1));

  //将这个字符串当作一个数组,随机取出一个字符,并循环拼接成你需要的位数

  $password .= $chars[$loop];

 }

 return $password;

}

echo getRandPass(12); //随机生成一个12位数的密码

 


?>

生成密码哪下

php快速生成一个随机的密码

例2,与第一个有一点像

1、预置一个的字符串 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符
2、在 $chars 字符串中随机取一个字符
3、重复第二步 n 次,可得长度为 n 的密码

 代码如下 复制代码

function generate_password( $length = 8 ) {
    // 密码字符集,可任意添加你需要的字符
    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_ []{}<>~`+=,.;:/?|';

    $password = '';
    for ( $i = 0; $i < $length; $i++ )
    {
        // 这里提供两种字符获取方式
        // 第一种是使用 substr 截取$chars中的任意一位字符;
        // 第二种是取字符数组 $chars 的任意元素
        // $password .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
        $password .= $chars[ mt_rand(0, strlen($chars) - 1) ];
    }

    return $password;
}

标签:[!--infotagslink--]

您可能感兴趣的文章: