如何在angular app和django app之间加密解密数据

问题描述 投票:0回答:1

我们有一个场景,我们的角度应用程序调用我们的后端API(使用django rest框架开发)。我们使用Jwt进行API身份验证。我们有一个端点url,它使用用户名和密码(POST请求)并使用django后端对用户进行身份验证。我们在APACHE HTTP Server上部署了应用程序,并使用SSL(Https)进行加密。

但我们也想加密请求有效负载(发送到django API的数据)。在当前情况下,从角应用程序加密用户名和密码,并解密django中的相应数据。为此,我们在角度应用程序中使用CryptoJs,在Django中使用Pycrypto。但我们无法解密django中的数据。

这是我们在django app上使用的解密函数代码:

MODE = AES.MODE_CBC

key = 'k%eu6sy)h&vue#5yrpok#1)^1ya#l1t('

def decrypt(ciphertext,key, mode):
    encobj = AES.new('k%eu6sy)h&vue#5yrpok#1)^1ya#l1t(', AES.MODE_CBC)
    decrypted = encobj.decrypt(ciphertext)
    return decrypted.decode('utf-8')



ciphertext_user_name=request.data['username'].encode("utf8")
ciphertext_pwd=request.data['password'].encode("utf8")
usr = decrypt(ciphertext_user_name,key,MODE)
pwd = decrypt(ciphertext_pwd,key,MODE)

我们也在CryptoJs中使用CBC模式。

上面的代码只是一个示例代码。有人可以建议,这是正确的方法,或者我们应该改变方法并做其他事情。

提前致谢 !

encryption cryptojs pycrypto
1个回答
1
投票

有人可以建议,这是正确的方法

为什么要单独加密有效负载(在ssl之外)?

当涉及到凭证(用户名,密码)时,如果您在浏览器中加密,则需要在某个地方的脚本中有一个密钥。这不会增加任何安全性,只会增加解决方案的复杂性。

您可以使用非对称密码(RSA,ECC)使用服务器的公钥加密数据。哦,等等 - HTTPS已经为你做了。

客户端加密可能位于您不希望服务器访问数据的位置(例如,安全消息传递,密码管理器等),但是对于用户名和密码,服务器无论如何都需要读取和处理凭据。

但我们无法解密django中的数据。

在这里,我们不知道如何在客户端加密数据。您可以尝试编辑问题并添加加密代码和错误消息

或者我们应该改变方法并做其他事情

虽然您的代码肯定存在一些问题(我无法判断它们是否全部存在)

  • 密文(加密数据)通常是二进制的(具有不可打印的字符)。这就是为什么当作为参数传递时,数据通常被编码为可打印的公共字符(hex,base64,..)。我看到你直接解密参数,你确定数据没有正确编码/发布吗?
  • 我看到你没有使用任何IV(CBC模式的初始化向量)。我假设你使用的库只会使用零数组IV。对于CBC模式(或通常的任何模式),使用静态/零IV非常不安全。你确定客户端不包含某种IV吗?
  • CBC模式具有可塑性,您应该应用一些完整性检查(在客户端脚本中使用完整性密钥,它不会添加任何值)

这一切都已经使用HTTPS完成(并且做得很好),因此您只是尝试实现另一层加密而没有真正增值(以及明显的弱点)。我相信这里的共同建议是充满信心地依靠HTTPS

© www.soinside.com 2019 - 2024. All rights reserved.