【问题标题】:Crypto / Token Auth guidance加密/令牌认证指南
【发布时间】:2018-09-21 21:01:22
【问题描述】:

我买了一些硬件,分享了一份关于如何验证here 的文档:

加密绝对不是我的事,我正在尝试找出加密的方式或什至是什么形式的加密,以尝试查找在线示例,以便我可以尝试使用 c# 和更可取的 .net 核心进行交流,这样我就可以成为 x-平台

现在有代码 here 可以做到这一点,除了它在 node.js 中我相信而且我不知道加密库

总而言之,这就是他们在文档中的陈述:

  1. 通过“jdev/sys/getPublicKey​”-> {publicKey} 获取 Miniservers 公钥存储在客户端 B.格式:X.509 编码的密钥 ANS.1
  2. 打开一个 WebSocket 连接使用以下路径:“ws://{ipOrUrl}:{port}/ws/rfc6455​” b.将“遥控器”指定为 Sec-WebSocket-协议。 C。 Miniserver 不支持 wss://。
  3. 生成 AES256 密钥 -> {key} (Hex)
  4. 生成随机 AES iv(16 字节)-> {iv}(十六进制)
  5. RSA 使用 {publicKey}​-> {session-key} (Base64) 加密 AES 密钥+iv “{key}:{iv}”是需要加密的payload 使用 RSA
  6. 通过“jdev/sys/keyexchange/{session-key}​”交换密钥
  7. 生成随机盐,十六进制字符串(长度可能不同,例如 2 个字节)-> {salt}
  8. 现在有两种选择:如果存在令牌,则按照使用令牌进行身份验证 b 中所述进行身份验证。如果需要令牌 获取,按照获取令牌配置 9.3 中的说明进行操作 与 Miniserver 通信第 5 页,共 21 页
  9. 在成功基于令牌的身份验证或获取新令牌后,套接字已通过身份验证并准备就绪。

所以我很确定我对第 2 步很满意(也许不是 x.509 编码密钥的格式。我将其视为去除填充并仅获取 base64 值:

        UriBuilder builder = new UriBuilder("http://192.168.0.77");
        using (var request = new LxHttpRequest(builder.Uri))
        {
            CancellationToken token = new CancellationToken();
            string result = request.GetStringAsync("jdev/sys/getPublicKey", token).Result;
            var res = ResultConverter.Deserialize(result);

            Console.WriteLine(TokenAuth.parsePublicKey(res.Content));
        }

第 3 步,我从 loxnet 克隆了代码,我认为这是一个很好的起点,对此我很满意..

第 4/5 步,是我所在的位置:

         var aes = new AesCryptoServiceProvider();
            aes.GenerateIV();
            byte[] iv = aes.IV;
            aes.GenerateKey();
            Console.WriteLine("Key base64: {0}", Convert.ToBase64String(aes.Key));

但是在这一点上,我的头被腌制了,我很生气。我很欣赏这种感觉就像是在寻求家庭作业的帮助-但我更希望有人能解释一下这叫什么,这样我就可以继续搜索-除非有人可以提供示例/ sn-ps 的帮助,或者建议使用 nuget 包进行艰苦的工作 - 我看过 bouncycastle 但这让我的眼睛想流血试图理解任何东西:D :D

请放轻松!

【问题讨论】:

  • 你到底在问什么?我了解问题的范围,但是您已经完成了第 4/5 步并且...什么?这里有什么问题?代码不工作还是你不确定现在该做什么?你能问一个具体的问题吗?
  • 我不知道接下来我需要做什么! - 我不明白知道这是哪种 AES 加密方法的步骤,所以我可以找到我可以适应的示例代码!例如查看 bouncycastle 功能列表bouncycastle.org/csharp 太多不同的算法,我无法测试每个.. 肯定有人知道这是什么吗?
  • 你有没有让这个工作?我正在尝试做同样的事情。
  • @PaulSinnema - 不太接近,但随后决定将基于令牌的身份验证添加到 github 上的现有项目之一可能会更容易。很高兴将其离线并通过电子邮件聊天,因为它可能会偏离主题:)
  • 好的,您可以通过 paul@sinnema.ch 与我联系

标签: c# encryption


【解决方案1】:

所以我再次查看了说明,并尝试按照我的方式完成它。这看起来像我在正确的轨道上吗:

    private static void CryptoTest()
    {
        byte[] serversPublicKey = GetPublicKey();

        // Create a new instance of RSACryptoServiceProvider.
        var RSA = new RSACryptoServiceProvider();
        var RSAKeyInfo = RSA.ExportParameters(includePrivateParameters: false);

        // Set RSAKeyInfo withthe provided public key. 
        RSAKeyInfo.Modulus = serversPublicKey;
        RSA.ImportParameters(RSAKeyInfo);

        // Generate New AES key
        var aes = new AesCryptoServiceProvider();
        aes.GenerateIV();
        aes.GenerateKey();

        byte[] sessionKey;

        using (var stream = new MemoryStream())
        {
            using (var writer = new BinaryWriter(stream))
            {
                // Encrypt the aes key and iv
                writer.Write(aes.Key);
                writer.Write(":");
                writer.Write(aes.IV);
            }

            sessionKey = RSA.Encrypt(stream.ToArray(), RSAEncryptionPadding.Pkcs1);
        }

        Console.WriteLine($"Encrypted Session Key (Base64): {Convert.ToBase64String(sessionKey)}");

        // Todo Step 7 send key to server

    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-28
    • 2015-01-05
    • 2019-04-29
    • 2014-12-18
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 2020-09-25
    相关资源
    最近更新 更多