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


Validate a string using pack('H*')

我正在加密数据库…我一直在使用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 s用于测试目的。但我想验证它是一个有效的十六进制/二进制或者这个字符串的数据类型。

执行:

print_r($key);

返回以下内容:

¼°K ~:صGci¼U«一)你们®^ ~/U *£

但是这是什么数据类型呢?在文档中:http://www.php.net/manual/en/function.mcrypt-encrypt.php该行如下所示:

将字符串转换为键

键使用十六进制

指定

我的问题是这是什么数据类型?我知道这是在ASCII范围内,但就我所知…此外,成功回答这个问题还将帮助我创建另一个键,而不是实际文档

指定的键。

$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分钟的工作)将完全阐明你上面的问题。

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

我已经计算了使用mcrypt的IV函数,然后使用bin2hex,在pack函数的第二个参数中使用这个似乎有效没有一次失败……但是,我的总体问题是如何验证:¼°K ~:صGci¼U«一)你们®^ ~/U *£下来到一个特定的数据类型

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

if (is_string($Var)){
}

是正确的方法,因为它是这样提交的。它不是bool,十六进制,二进制,int。所以唯一有效的验证方法是将其作为字符串进行验证。