首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript中的SHA256Cng

Javascript中的SHA256Cng
EN

Stack Overflow用户
提问于 2014-04-30 06:10:42
回答 1查看 278关注 0票数 0

我需要能够在javascript中生成一个在服务器上匹配的散列值。

以下是示例输入:

代码语言:javascript
复制
string plaintext = "1398836885";
string salt = "8xTpd9gMxF22nBcotVChIH5ocxplLQzI3Ba7xXBkMyyOVVr6e5/mupqxFHYVQD0U77BEbQ9auMWglUK63PeqCX4eB8kzBoOEAr1nXqpT3jjNwdYPQPdRvwPjdI/357CP";

正确的散列结果是:

代码语言:javascript
复制
ovsvdWYOUIXU+LAfIYtOf7N60v6Qap6qBgS3IVwBG6k=  

获取明文的代码是:

代码语言:javascript
复制
var now = ((long)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds).ToString();  

以及生成正确哈希的代码:

用法:

代码语言:javascript
复制
var _hash = Hashbrowns.Hash(plaintext, salt);  

代码:

代码语言:javascript
复制
public static class Hashbrowns
{
    private const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";

    public static string Hash(string plaintext, string salt = null)
    {
        return Hashbrowns.Hash<SHA256Cng>(plaintext, salt);
    }

    public static string Hash<TAlgorithm>(string plaintext, string salt = null) where TAlgorithm : HashAlgorithm, new()
    {
        var algorithm = Activator.CreateInstance<TAlgorithm>();

        if (string.IsNullOrWhiteSpace(salt))
        {
            salt = Config.Salt;
        }

        var data = Encoding.UTF8.GetBytes(plaintext + salt);
        return Convert.ToBase64String(algorithm.ComputeHash(data));
    }

    public static string HashPassword(string value)
    {
        return Hash(value, Config.Salt + Config.Spice);
    }

    public static string RandomString(int length)
    {
        var random = new Random();
        return new string(
            Enumerable
                .Repeat(Hashbrowns.chars, length)
                .Select(o => o[random.Next(o.Length)])
                .ToArray()
            );
    }
}  

JAVASCRIPT部件

在我的javascript代码中,我使用密码Js获取SHA256:

代码语言:javascript
复制
<script type="text/javascript" src="plugin/CryptoJS v3.1.2/rollups/sha256.js"></script>  
代码语言:javascript
复制
Hash: function(){

    var o = "13988354648xTpd9gMxF22nBcotVChIH5ocxplLQzI3Ba7xXBkMyyOVVr6e5/mupqxFHYVQD0U77BEbQ9auMWglUK63PeqCX4eB8kzBoOEAr1nXqpT3jjNwdYPQPdRvwPjdI/357CP",
            hash256 = CryptoJS.SHA256(o),           
        ;

    console.log(hash256.toString(CryptoJS.enc.Base64)); 

}  

结果是:

代码语言:javascript
复制
a2fb2f75660e5085d4f8b01f218b4e7fb37ad2fe906a9eaa0604b7215c011ba9  

显然,他们是不一样的。

幸运的是,有一个版本的JAVA代码,可以产生同样的结果。我刚从外包开发人员那里得到这段代码,我告诉你,我对JAVA不太熟悉。

代码语言:javascript
复制
StringBuilder sb = new StringBuilder();

    MessageDigest md = MessageDigest.getInstance("SHA-256");
    md.reset();
    byte[] buffer = hash.getBytes("UTF-8");
    md.update(buffer);
    byte[] digest = md.digest();

    for (int i  = 0; i < digest.length; i++){
      sb.append(Integer.toString((digest[i] & 0xff) + 0x100, 16).substring(1));
    }

    hashKey = Base64.encodeToString(digest, Base64.DEFAULT);

}

他们说,他们能够得到正确的结果使用这段代码。如果这段代码可以转换成javascript代码,这可能解决问题。

顺便说一下,这段代码是一个简单的移动应用程序(html基础)的一部分,它将使用PhoneGap发布。服务器上没有API可以用来生成哈希。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-30 06:18:43

哈希部分实际上很好--在这两种情况下都得到相同的二进制数据--唯一的区别是Javascript中的输出是十六进制的,而不是base64的。这个C#代码:

代码语言:javascript
复制
using System;

class Test
{
    static void Main()
    {
        string base64 = "ovsvdWYOUIXU+LAfIYtOf7N60v6Qap6qBgS3IVwBG6k=";
        byte[] rawData = Convert.FromBase64(base64);
        Console.WriteLine(BitConverter.ToString(rawData));
    }
}

..。打印出来:

代码语言:javascript
复制
A2-FB-2F-75-66-0E-50-85-D4-F8-B0-1F-21-8B-4E-7F-B3-7A-D2-FE-90-6A-9E-AA-06-04-B7-21-5C-01-1B-A9

这与您的Javascript输出、模大小写和字节之间的"-“相同。

我刚刚用Crypto尝试了一下,我认为问题是您没有enc-base64.js组件,它没有包含在汇总中。只需添加:

代码语言:javascript
复制
<script type="text/javascript" src="plugin/CryptoJS v3.1.2/components/enc-base64.js"></script>

..。一切都会没事的。(当然,检查一下你有那份文件.)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23380851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档