在一个场景中,我们的角度应用程序调用了我们的后端API(使用django rest框架开发)。我们正在使用Jwt进行API身份验证。我们有一个终结点URL,它使用用户名和密码(POST请求)并使用django后端对用户进行身份验证。我们已经在APACHE HTTP Server上部署了应用程序,并使用SSL(Https)进行了加密。
但是我们也想对请求有效载荷(发送到django API的数据)进行加密。在当前情况下,从angular应用程序加密用户名和密码,并以django解密相应的数据。为此,我们在angular应用程序中使用CryptoJs,在Django中使用Pycrypto。但是我们无法解密django中的数据。
这是我们在Django应用上使用的解密功能代码:
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)
我们也在CryptoJ中使用CBC模式。
以上代码仅是示例代码。有人可以建议,这是正确的方法,还是我们应该改变方法并做其他事情。
谢谢!
答案 0 :(得分:1)
有人可以建议,这是正确的做法
为什么要单独加密有效负载(ssl之外)?
关于凭据(用户名,密码),如果您在浏览器中进行加密,则需要在脚本中的某个位置有一个密钥。这不会增加安全性,只会增加解决方案的复杂性。
您可以使用非对称密码(RSA,ECC)来使用服务器的公钥加密数据。哦,等等-HTTPS已经为您做到了。
客户端加密可能在您不希望服务器访问数据的地方(例如,安全消息传递,密码管理器等),但是对于用户名和密码,服务器仍然需要读取和处理凭据。
但是我们无法在Django中解密数据。
在这里我们不知道如何在客户端加密数据。您可以尝试编辑问题并添加加密代码和错误消息
或者我们应该改变方法并做其他事情
尽管您的代码中肯定存在一些问题(我无法确定是否全部都是问题)
这一切都已经使用HTTPS完成(并且做得很好),因此,您只是在尝试实现另一层加密,而该加密层并没有真正的附加值(还有明显的弱点)。我相信这里的常见建议是放心使用HTTPS