使用pack验证字符串('H *')

时间:2013-06-06 02:38:00

标签: php

我正在使用加密数据库...我一直在使用m_crypt函数..我已成功获得加密/解密方法..但问题在于创建我的OO类来提供此功能..我有以下内容:

class Encryption {
    public function __construct($Hex = null){
        if (isset($Hex)){
            if (ctype_xdigit($Hex)){
                echo "Is Hex";
            }
            if (preg_match('~^[01]+$~', $Hex)) {
                echo "Is Binary";
            }
        }
    }
}

$key = pack('H*', "bcb04b7e103a0cd8b54763051cef08bc55abe029fdebae5e1d417e2ffb2a00a3");
$Class_OO = new Encryption($key);

echo用于测试目的..但我想将此验证为有效的十六进制/二进制或此字符串的数据类型。

表演:

print_r($key);

返回以下内容:

  

¼°K〜:ØμGcï¼U«A)ýë®^ A〜/ U *£

但这是什么数据类型?在文档上:http://www.php.net/manual/en/function.mcrypt-encrypt.php该行显示为:

  

将字符串转换为键

     使用十六进制

指定

所以我的问题是这是什么数据类型?我知道这是在ASCII范围内,但据我所知,这就是..此外,一个成功的答案也将帮助我创建另一个不是实际文档指定的密钥

2 个答案:

答案 0 :(得分:2)

你的$ key是pack的返回值,在这种情况下是二进制字符串(基本上是原始二进制值)。请参阅文档中第一行的 pack()函数返回值:http://php.net/manual/en/function.pack.php

  

根据格式将参数打包成二进制字符串 [强调添加]。

在尝试任何类型的输出之前,您通常会对二进制字符串进行base64编码,因为根据定义,二进制字符串可能(通常会)包含不可打印的字符,或者更糟糕的是 - 终端控制/转义序列可能会阻塞您屏幕。

将其视为打印原始Word或Excel文件:您可能会看到可识别的值(虽然在这种情况下偶尔使用字母数字),但也会产生大量垃圾。

Base64编码是一种以安全的方式检查这些字符串的技术。

但你的问题意味着你正在进入这个领域。您可以在这里查看Matasano加密教程:http://www.matasano.com/articles/crypto-challenges/。这是一个很好的起点,完成练习#1(可能是20分钟的工作)将完全解释你的上述问题。

答案 1 :(得分:1)

回答您的问题..提交的唯一可行的可行数据类型是字符串。正如你在评论中所说:

  

我已经想过使用mcrypt的IV函数然后使用bin2hex,   在包函数的第二个参数中使用它似乎工作   没有失败..但是,我的整体问题是如何验证:   ¼°K~:ØμGcï¼U«à)ýë®^ A~ /û*£降至特定数据类型

您已经回答了如何为pack('H*')创建可接受的格式,但就验证而言:

if (is_string($Var)){

}

是否可行,因为这是它的提交方式。它不是bool,hex,binary,int ..所以唯一有效的验证方法是将其验证为字符串。