簡體   English   中英

將通過加密從PHP復制到JS

[英]Replicate pass encryption from PHP to JS

我想在JS中復制以下PHP代碼:

    $salted = $raw_pass."{".$salt."}";
    $iterations = 5000;
    $digest = hash('sha512', $salted, true);

    // "stretch" hash
    for ($i = 0; $i < $iterations; $i++) {
        $digest = hash('sha512', $digest.$salted, true);
    }

    return base64_encode($digest);

它通過遍歷和遍歷進行5000次迭代來創建哈希。 這實際上來自Symfony的MessageDigestPasswordEncoder (為示例起見,我對代碼進行了一些更改,對於可能的拼寫錯誤感到抱歉)。

我想在JavaScript中復制它,並這樣做:

var salted = raw_pass + "{" + salt + "}"
var digest = CryptoJS.SHA512(salted);              

for (var i=0;i<5000;i++){
    digest = CryptoJS.SHA512(digest+salted);
}

user.password = CryptoJS.enc.Base64.stringify(digest)

創建digest時,一切正常(兩邊都得到相同的字符串),但是反復重申后,我得到了不同的哈希值。 symfony方面正在工作,因此問題出在此JS中。

我究竟做錯了什么?

以后的編輯:我想我有一個為什么為什么不行的想法。 digest是一個對象, salted是一個字符串。 CryptoJS.SHA512都接受,但是我不認為digest + salted不是所期望的。

我認為問題是在PHP中您在1初始化了循環:

for ($i = 1; $i < $iterations; $i++)

但是在JavaScript中,您要在0初始化循環:

for (var i=0;i<5000;i++)

我認為這里是一個問題:

<?php
    $salted = $raw_pass."{"$salt."}";
?>

您忘記了一個點(。),應該是這樣的:

<?php
    $salted = $raw_pass."{".$salt."}";
?>

同樣,您從1開始一次,從0開始一次(請參見下面的帖子)

我無法解決它,所以我不得不改變策略。 考慮到我正在編碼已經編碼(和加鹽)的數據,並且沒有將完整的信息提供給用戶,因此我應該是安全的。

我改為SHA1,並且正在使用btoa()atobe() JS函數。

似乎您為什么不只使用PBKDF2,因為CryptoJS也提供了它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM