我正在生成要从Ruby堆栈发送到PHP堆栈的数据.我在Ruby端使用OpenSSL :: Cipher库,在PHP使用'mcrypt'库.当我在Ruby中使用'aes-256-cbc'(256位块大小)进行加密时,我需要在PHP中使用MCRYPT_RIJNDAEL_128(128位块大小)来解密它.我怀疑Ruby代码坏了,因为cipher.iv_len是16; 我相信它应该是32:
>> cipher = OpenSSL::Cipher::Cipher.new('aes-128-cbc')
=> #<OpenSSL::Cipher::Cipher:0x3067c5c>
>> cipher.key_len
=> 16
>> cipher.iv_len
=> 16
>> cipher = OpenSSL::Cipher::Cipher.new('aes-256-cbc')
=> #<OpenSSL::Cipher::Cipher:0x306de18>
>> cipher.key_len
=> 32
>> cipher.iv_len
=> 16
Run Code Online (Sandbox Code Playgroud)
所以这是我的考试.在Ruby方面,首先我生成密钥和iv:
>> cipher = OpenSSL::Cipher::Cipher.new('aes-256-cbc')
>> cipher.encrypt
>> iv = cipher.random_iv
>> iv64 = [iv].pack("m").strip
=> "vCkaypm5tPmtP3TF7aWrug=="
>> key = cipher.random_key
>> key64 = [key].pack("m").strip
=> "RIvFgoi9xZaHS/0Bp0J9WDRyND6Z7jrd3btiAfcQ8Y0="
Run Code Online (Sandbox Code Playgroud)
然后我使用这些密钥进行加密:
>> plain_data = "Hi, Don, this is a string."
>> cipher = OpenSSL::Cipher::Cipher.new('aes-256-cbc')
>> cipher.encrypt
>> cipher.key = Base64.decode64(key64)
>> …Run Code Online (Sandbox Code Playgroud) 这个问题是我最后一个问题的延续,关于如何使Ruby AES-256-CBC和PHP MCRYPT_RIJNDAEL_128一起发挥得很好.我现在已经开始工作,但我仍然在努力朝着另一个方向努力.PHP生成的密码似乎具有提供的所有信息,但是我无法使用Ruby代码来解密它而不会出现错误.
这是我用来生成密码的PHP代码:
$cleartext = "Who's the clever boy?";
$key = base64_decode("6sEwMG/aKdBk5Fa2rR6vVw==\n");
$iv = base64_decode("vCkaypm5tPmtP3TF7aWrug==");
$cryptogram = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $cleartext, MCRYPT_MODE_CBC, $iv);
$result = base64_encode($cryptogram);
print "\n'$result'\n";
RESULT
'JM0OxMINPTnF1vwXdI3XdKI0KlVx210CvpJllFja+GM='
Run Code Online (Sandbox Code Playgroud)
然后这是尝试在Ruby中解密:
>> cipher = OpenSSL::Cipher::Cipher.new('aes-128-cbc')
>> cipher.key = Base64.decode64("6sEwMG/aKdBk5Fa2rR6vVw==\n")
>> cipher.iv = Base64.decode64("vCkaypm5tPmtP3TF7aWrug==")
>> cryptogram = Base64.decode64('JM0OxMINPTnF1vwXdI3XdKI0KlVx210CvpJllFja+GM=')
>> cleartext = cipher.update(cryptogram)
=> "Who's the clever"
>> cleartext << cipher.final
OpenSSL::Cipher::CipherError: bad decrypt
from (irb):100:in `final'
from (irb):100
Run Code Online (Sandbox Code Playgroud)
令人沮丧的是,可以从加密字符串中获取整个明文.重复上述内容,但在密码中添加一个无意义的填充:
>> cleartext = cipher.update(cryptogram + 'pad')
=> "Who's the clever …Run Code Online (Sandbox Code Playgroud) 所以我不能停止得到错误:
PHP Fatal error: Call to undefined function mcrypt_decrypt() in
Run Code Online (Sandbox Code Playgroud)
即使我安装了php5_mcrypt,我已经重新安装了很多次php,但是我无法让它工作!
更多信息:
mandatory@mandatorys-box:~/Desktop/bots$ dpkg -l | grep php
ii libapache2-mod-php5 5.5.3+dfsg-1ubuntu2.1 amd64 server-side, HTML-embedded scripting language (Apache 2 module)
ii php5 5.5.3+dfsg-1ubuntu2.1 all server-side, HTML-embedded scripting language (metapackage)
ii php5-cli 5.5.3+dfsg-1ubuntu2.1 amd64 command-line interpreter for the php5 scripting language
ii php5-common 5.5.3+dfsg-1ubuntu2.1 amd64 Common files for packages built from the php5 source
ii php5-curl 5.5.3+dfsg-1ubuntu2.1 amd64 CURL module for php5
ii php5-json 1.3.1+dfsg-2 amd64 JSON module for php5
ii php5-mcrypt …Run Code Online (Sandbox Code Playgroud) 如何在Windows上的xampp中安装mcrypt?
我的PHP版本7.0.5和xampp包没有mcrypt 扩展,所以如何在xampp上安装mcrypt?
我昨天在这里,得到了一些非常好的答案.我把我得到的东西放在一起,我认为这将是一个相当安全的算法.我在使用带有生成盐的for循环的河豚时遇到了问题.
我正在使用base64字符和for循环来获取随机字符串.我想把这个生成的字符串作为salt插入到crypt函数中.
因为关于河豚的文档非常稀疏,PHP文档甚至没有提到它,所以我在这里黑暗中刺伤.
真正奇怪的是,如果您按照现在的方式运行此代码,它将不会失败.除去任一的"$ 2A $ $ 07"从上面的for循环或从crypt函数,它会间歇性地返回一个加密的字符串.我对河豚的理解是,加密的字符串必须以'$ 2a $ 07 $'开头,以$'结尾,因此在crypt函数中连接.我真的不需要for循环之上的开始字符串而只是想得到摆脱它.
我还想澄清关于在数据库中存储随机盐的最佳实践,还是将crypt函数的输出存储在数据库中?
昨天,没有真正的代码被抛出,只是讨论.我今天想把一些代码放在一起,并且有一些相当安全的东西.如果有人能想出更好的算法,我总是敞开心扉.
$base64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
$salt = '$2a$07$';
for($i=0; $i<60; $i++)
{
$salt .= $base64[rand(0,63)];
}
return crypt('password', '$2a$07$'.$salt.'$');
Run Code Online (Sandbox Code Playgroud) 我是运行Web应用程序的开发人员团队的一员,该应用程序存储和检索HIPAA(医疗)数据.最近,更新了HIPAA指南以包括一项策略,该策略要求所有识别客户信息在"静止"(存储在数据库中且未被访问)时加密.
我们必须解决的第一个问题是确定以双向加密数据的最佳方式,以便在发生破坏时使数据安全.
我们提出的最快的解决方案是在将数据插入数据库之前使用mcrypt加密数据.
我们正在开发的应用程序已经很老了(就像Web应用程序一样)并且使用了大量的过程编程以及严重依赖mysql_query函数来插入,更新,检索和删除数据.我们没有时间或奢侈地将我们的代码翻译成数据库抽象层.因此,实现此加密/解密系统的唯一方法是手动编辑所有CRUD查询以使用通过mcrypt加密的数据.这是非常低效且极易出错的.
我们认为解决问题的最快最有效的方法是用我们自己设计的方法覆盖本机mysql_query函数.在我们的新函数中,我们将在将查询发送到服务器/返回结果集之前加密/解密数据值.
更新
我已对C#代码进行了更改,因此它使用的块大小为256.但是现在hello世界看起来像这个http://pastebin.com/5sXhMV11而且我无法弄清楚我应该使用rtrim()来获取最后骑的烂摊子.
另外当你说IV应该是随机的时,你的意思是不要再使用相同的IV一次或者我编码错误的方式?
再次感谢!
嗨,
我正在尝试使用在C#中加密的PHP解密字符串.我似乎无法让PHP使用mcrypt解密它,并且可以提供一些帮助.我用php得到以下错误,所以我猜我没有正确设置IV.
错误:IV参数必须与块大小一样长
两个函数使用相同的密码,密钥,IV并设置为CBC模式:
加密文本来自c#= UmzUCnAzThH0nMkIuMisqg ==
key 32 long = qwertyuiopasdfghjklzxcvbnmqwerty
iv 16 long = 1234567890123456
C#
public static string EncryptString(string message, string KeyString, string IVString)
{
byte[] Key = ASCIIEncoding.UTF8.GetBytes(KeyString);
byte[] IV = ASCIIEncoding.UTF8.GetBytes(IVString);
string encrypted = null;
RijndaelManaged rj = new RijndaelManaged();
rj.Key = Key;
rj.IV = IV;
rj.Mode = CipherMode.CBC;
try
{
MemoryStream ms = new MemoryStream();
using (CryptoStream cs = new CryptoStream(ms, rj.CreateEncryptor(Key, IV), CryptoStreamMode.Write))
{
using (StreamWriter sw …Run Code Online (Sandbox Code Playgroud) 我正在尝试通过url将加密数据发送到另一个站点(使用file_get_contents("anotherUrl.php?hash=$encryptedString").问题是,有时,加密包含一些特殊字符,如+,这会导致解密失败.
这是我的加密/解密方法:
public function encrypt($string, $key)
{
return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, md5(md5($key))));
}
public function decrypt($encrypted, $key)
{
return rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($encrypted), MCRYPT_MODE_CBC, md5(md5($key))), "\0");
}
Run Code Online (Sandbox Code Playgroud)
这是一个包含a的加密字符串示例+,我猜这会导致解密失败.
oWCrVPaS+5GbxcQFc0fulUk/zRAkDD60av4zlPiWskE=
任何想法我应该如何解决这个问题?我试图做urlencode()和urldecode()哈希,但这似乎也导致加密打破.有没有办法更改加密算法,使其只返回url安全字符?
我在 PHP 7.1.25 中,mcrypt 是当前使用的扩展,mcrypt 将在 PHP 7.2 中被弃用,Libsodium 将被添加到 PHP 7.2 的核心扩展中
现在我需要尝试在 PHP 7.1 中安装 libsodium 并查看它是如何工作的,按照这个https://lukasmestan.com/install-libsodium-extension-in-php7但安装失败。也更新了 PECL 包。看下面的错误!
任何帮助将非常感激。提前致谢!
$ sudo pecl install -f libsodium
downloading libsodium-2.0.20.tgz ...
Starting to download libsodium-2.0.20.tgz (28,504 bytes)
.........done: 28,504 bytes
4 source files, building
running: phpize
Configuring for:
PHP Api Version: 20160303
Zend Module Api No: 20160303
Zend Extension Api No: 320160303
building in /tmp/pear/temp/pear-build-rootsL5uMO/libsodium-2.0.20
running: /tmp/pear/temp/libsodium/configure --with-php-config=/usr/bin/php-config
checking for grep that handles long lines and -e... /bin/grep …Run Code Online (Sandbox Code Playgroud) 我已经将我的Mac OS X更新为Yosemite,但是这样做我写了我所有的开发环境.所以现在,要在我的本地apache上运行Laravel 4,我需要安装Mcrypt扩展,但是我尝试过的所有内容都失败了.甚至是OS X Mavericks上的步骤(10.9)
有人有同样的问题吗?提前致谢.
干杯