是否可以在客户端 sign/encrypt 数据以确保它不被用户操纵?

Is it possible to sign/encrypt data on the client-side to ensure it was not manipulated by the user?

我将信息保存在本地存储中,我想确保用户没有替换数据或从中获得乐趣。

客户端接收到一个对象,javascript对其进行分析,然后将其中的一部分存储在浏览器的本地存储中。

每 30 秒向服务器发送一次数据,服务器根据之前发送的数据由另一个对象回复。

该过程经常发生,因此最好避免向服务器发送大量数据并进行大量查询以验证完整性。

我知道 Javascript 在客户端中容易进行调试、逆向工程等。但它肯定会增加一层安全性,所以至少有些人不会打扰。 (默默无闻的安全)

我最初的想法是对要存储的值进行校验和,将其发送到服务器并将其与存储的校验和进行比较。如果结果不匹配,则在客户端关闭数据。我认为最好避免存储在数据库中并能够通过某些功能检查它是否合法。

我希望存储的数据看起来像令牌(如签名或加密的 base64 字符串)而不是原始数据,因为它会泄露一些有关代码工作方式的信息并可能使其易受攻击。

是否有图书馆或这样做的方法可以帮助我的旅程?

Is it possible to sign/encrypt data on the client-side to ensure it was not manipulated by the user?

简答 - 不,这是不可能的。
长答案 - 任何消息身份验证代码(签名、hmac、..)都需要一个秘密值。一旦您通过 JavaScript 在客户端进行签名,就无法阻止用户访问机密或修改数据。

考虑到用户甚至可能会修改应用程序以更改客户端验证。长话短说 - 永远不要相信用户的输入,您必须始终在服务器端验证数据。

建议 - 您可以将数据发送到服务器服务,服务器可以 sign/hmac 数据。与验证数据完整性的方式相同。

But it would definitely add a layer of security so at least some people wouldn't bother. (Security through obscurity)

在我看来 - 这并不重要。如果用户不关心,他就不会修改数据。如果你有一个忠实的用户,任何级别的混淆都不会阻止他。

I would prefer if the data stored would look like a token (like a signed or encrypted base64 string)

没有什么能阻止你这样做。