0

我試圖使用mcrypt_encrypt()加密密碼。它是在localhost工作正常,但是當網上去,我的輸出是""和我得到這樣的警告:警告:此算法不支持mcrypt_encrypt():大小爲10的密鑰。只有大小爲16,24或32的密鑰支持

警告:mcrypt_encrypt():不 這種算法支持的尺寸10鍵。只有尺寸鍵16,24或32的支持

這是代碼我使用:

$text="thisismypassword123"; 
$salt="1234567824"; 
return trim (
    base64_encode (
     mcrypt_encrypt (
      MCRYPT_RIJNDAEL_256, $salt, $text, MCRYPT_MODE_ECB, mcrypt_create_iv (
       mcrypt_get_iv_size (
        MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB 
       ), 
       MCRYPT_RAND 
      ) 
     ) 
    ) 
); 

什麼可能是這個原因,我能做些什麼來解決這個問題?

+2

請不要使用MCRYPT_MODE_ECB模式,因爲鹽不會被使用。使用MCRYPT_MODE_CBC。使用'openssl_'加密例程而不是'mcrypt'更可靠。 –

+0

考慮接受有用的答案。 要接受答案,請點擊最佳答案旁邊的空白複選標記,這樣做會增加您的聲望並提供更多功能。請參閱[聲譽常見問題](http:// stackoverflow。com/faq#reputation)請參閱[本頁](http://meta.stackoverflow.com/questions/5234/how-does-accepting-an-answer-work)瞭解更多詳情。 另外請考慮回去和接受過去的答案,這樣做會增加你的聲望,並允許更多的功能,請參閱[聲譽常見問題](http://stackoverflow.com/faq#reputation) – zaph

回答

2

有什麼不清楚的警告?提供可接受尺寸的鑰匙。

關鍵是你所說的$ salt,它不是鹽,它是加密密鑰。重命名它以使代碼更清晰。

某些實例可能會向密鑰添加填充字節,但這是非標準的,並且對於不同的實現可能會有所不同。不要相信參數填充,請指定全長。

另外,從第加密文檔:

MCRYPT_RIJNDAEL_256不是AES-256,它是Rijndael的塊密碼的不同變體。如果您需要mcrypt中的AES-256,則必須使用帶有32字節密鑰的MCRYPT_RIJNDAEL_128。

您應該使用AES選項。

該代碼使用不安全的ECB模式,不應使用,不使用IV。可能你想要做的是使用需要IV的CBC模式。解密需要同樣的IV。

應該不需要trim Base64編碼。

最後,嵌套幾個級別的函數(這裏是6)似乎是一個好主意,但它使調試幾乎不可能,因爲不能檢查中間結果。

然後有mcrypt,最好不要使用mcrypt,它是棄用的,多年未更新,不支持標準的PKCS#7填充,只有非標準的null填充甚至不能使用與二進制數據。請考慮使用defuse,它正在維護和正確。

-1

在PHP 5.6及更高版本中,您的$salt需要爲或16,24或32個字符的隨機字符串。您的localhost可能仍然使用舊版本的PHP。

此代碼應在本地主機和您的服務器上運行兩個:

$text="thisismypassword123"; 
$salt="ddv21sd5dv56sd51"; // <- 16 characters long 
return trim (
    base64_encode (
     mcrypt_encrypt (
      MCRYPT_RIJNDAEL_256, $salt, $text, MCRYPT_MODE_ECB, mcrypt_create_iv (
       mcrypt_get_iv_size (
        MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB 
       ), 
       MCRYPT_RAND 
      ) 
     ) 
    ) 
); 

即使這個代碼工作,還存在其他問題,有了它,你可能希望考慮。

查看其他答案(尤其是Scott Arciszewski的答案),以瞭解您的代碼還有什麼問題以及爲什麼您甚至不應該首先使用mcrypt_encrypt()

+2

請不要使用'MCRYPT_MODE_ECB'模式因爲鹽不會被使用。 –

+0

@RyanVincent:你會推薦什麼來替代「MCRYPT_MODE_ECB」? –

+0

@RyanVincent:那你在說什麼?你對'MCRYPT_MODE_ECB'提出了什麼建議? –

4

我試圖加密密碼

This is probably a mistake。你把鑰匙稱爲「鹽」的事實讓我更加謹慎。需要存儲用戶的密碼? 加密不是這個工作的正確工具。 密碼哈希是。 They're wildly different concepts

但讓我們忽略「作業的錯誤工具」方面,並假設您出於某種原因正在加密非密碼字符串。即使在這種情況下,您的加密代碼也是不安全的。

return trim (// Why are you trimming this? 
    base64_encode (
     mcrypt_encrypt (
      MCRYPT_RIJNDAEL_256, // Not AES 
      $salt, 
      $text, 
      MCRYPT_MODE_ECB,  // The WORST mode possible 
      mcrypt_create_iv ( // ECB mode doesn't use an IV 
       mcrypt_get_iv_size (
        MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB 
       ), 
       MCRYPT_RAND  // Even if an IV was used, MCRYPT_RAND 
           // is a bad choice! Use MCRYPT_DEV_URANDOM 
      ) 
     ) 
    ) 
); 

即使你固定的上述問題,你有一個更嚴重的問題:Chosen-ciphertext attacks

解決方案:

你能告訴誰給你的代碼片段,他們正在互聯網上傳播不安全的代碼?謝謝。

2

解決向後兼容性的簡單方法是用\ 0填充當前密碼。

例如,對於PHP 5.4上當前的$ key =「1234567890」,由於當前密鑰大小爲10,它將停止在PHP 5.6版本上工作。

爲了解決它,而不應用任何影響只是改變爲$鍵= 「1234567890 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0」(直到達到或,...)

相關問題