问题标签 [public-key-encryption]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - C#如何进行加密?
我不是要一个带代码的教程,我正在尝试做研究,但我想确保我问的是正确的问题。
- 我可以使用 .NET 开箱即用的最佳加密形式是什么?
- 公钥/私钥,我在哪里安全地存储这些东西?
- 为了正确执行此操作,我应该拥有哪些工具?
我从 AESCryptoServiceProvider 开始,加密了我传入的字符串,我很高兴。测试如果我调用它两次,它会得到相同的值。然后意识到我没有提供任何形式的密钥,所以应用程序的第二次运行产生了不同的结果。所以我开始阅读,看到 RSA 公钥/私钥等等等。只是想确保我正在阅读我正在做的正确的道路。那里有很多例子,很少有人提到你把这些钥匙放在哪里,或者你从哪里得到它们。
java - Java公私钥解密问题
我正在尝试加密和解密以下代码中提到的消息。基本上我想用公钥加密消息并将加密消息从字节数组转换为字符串。并将此字符串解密为原始文本。这是两种方法。这里加密工作正常,但解密失败(错误是“数据必须从零开始”)。我认为这是因为我将加密的字节数组转换为字符串。
我该如何解决这个问题?(我想将加密的字节数组作为字符串并将其用于解密)有没有其他方法(使用公钥和私钥)
java - 使用 Bouncy Castle API 的 Java 安全性
我想知道 Bouncy Castle API 是否适合 Java 中的非对称加密。
目前我正在使用 Java 的 JCE API 执行此操作。如果我使用 Bouncy Castle API 进行非对称加密会有什么优势吗?
ruby - 创建一个安全的、基于 Web 的密码管理系统,能够在用户之间共享数据
我提前为即将到来的Wall-O-Text道歉。这是(至少,对我来说)一个相当复杂的问题,我已经考虑了很多。如果你愿意的话,你可以阅读我的问题,也可以在这个 GitHub Gist 上看到一个用 Ruby 编写的测试实现(非常仓促,没有数据库支持,而且可能非常丑陋) 。
介绍
想象一下,需要创建一个基于 Web 的密码管理系统(通过 SSL!:) 具有以下要求:
- 个人用户使用他们自己的唯一密码短语登录系统。
- 这个密码短语应该足以让用户有效地使用系统(例如,通过智能手机等)——关键是他们不应该随身携带密钥文件。
- 用户可以在系统中存储任意长度的数据位(“条目”)。
- 条目在数据库中以这样一种方式加密,即数据库或应用程序中没有足够的信息来读取加密的条目。
- 用户应该能够与系统的其他用户“共享”条目,以便其他用户可以阅读条目的内容。
我不是密码学专家。想了一会儿,我想到了以下几点。 我的问题是:这个实现安全吗?我错过了什么吗?如果是这样,上述规范甚至可以实施吗?或者这是矫枉过正?
数据库
数据库是这样设置的:
基本用例
让我们想象一下系统的两个用户,Alice 和 Bob。
Bob注册该网站:
- Bob 输入密码。此密码被发送到服务器(但不存储)。
- 服务器生成随机盐并将其存储在
salt
字段中。 - 服务器生成 Bob 的密码和 salt 的 SHA-256 哈希。
- 服务器生成一个 RSA 密钥对。公钥以纯文本形式存储在
pub_key
字段中。私钥通过 AES-256 使用 Bob 的密码和 salt 生成的哈希作为密钥进行加密,并存储在enc_priv_key
字段中。 - 服务器使用 Bob 的密码和 salt 作为密钥为 Bob 的私钥生成一个基于哈希的消息验证代码,并将其存储在
priv_key_hmac
字段中。
Bob在系统中存储一个条目:
- Bob 输入了一些数据和他的密码一起存储为条目。该数据被发送到服务器。
- 服务器生成一个密钥,用作 AES-256 加密的密钥。
- 服务器使用此密钥加密数据并将结果存储在
enc_data
字段中。 - 服务器使用生成的密钥为数据生成基于散列的消息验证码,并将其存储在
data_hmac
字段中。 - 用于加密数据的对称密钥使用 Bob 的公钥加密并存储在
enc_sym_key
字段中。 - 服务器使用 Bob 的私钥生成对称密钥的签名。
Bob检索他存储的条目:
- Bob 输入他的密码和要检索的条目的 ID。
- 服务器生成 Bob 的密码和 salt 的 SHA-256 哈希。
- Bob 的加密私钥使用哈希通过 AES-256 加密进行解密。
- 服务器通过检查 中的 HMAC 来验证 Bob 的加密私钥没有被篡改
priv_key_hmac
。 enc_sym_key
服务器使用 Bob 的私钥解密存储在该字段中的对称密钥。sym_key_sign
服务器通过使用 Bob 的公钥验证签名来验证加密的对称密钥没有被篡改。- 服务器使用对称密钥解密数据。
data_hmac
服务器通过验证存储在字段中的 HMAC 来验证加密数据没有被篡改。- 服务器将解密后的数据返回给 Bob。
Bob与 Alice 共享一个条目:
- Bob 希望 Alice 能够访问他拥有的条目。他输入他的密码和要共享的条目的 ID。
- 条目的数据使用“Bob 检索他存储的条目”中的方法解密。
- 以与“Bob 在系统中存储条目”相同的方式为 Alice 创建一个新条目,但以下情况除外:
- 条目
parent_entry
设置为 Bob 的条目。 - 对称密钥的签名是使用 Bob 的私钥计算的(因为 Alice 的私钥对 Bob 不可用)。
- 当 Alice 访问这个新条目时,非空值的存在
parent_entry
会导致系统使用 Bob 的公钥来验证签名(因为他的私钥被用来创建它)。
- 条目
Bob更改了他共享条目中的数据:
- Bob 决定更改他与 Alice 共享的条目中的数据。Bob 指出要修改的条目 ID 和它应该包含的新数据。
- 系统会覆盖在“Bob 在系统中存储条目”中创建的数据。
- 系统找到与
parent_entry
刚刚修改的条目相等的每个条目,并为每个条目覆盖在“Bob 与 Alice 共享一个条目”中创建的数据。
分析
优点:
- 如果没有拥有数据的用户的密码,就不可能从数据库中解密任何数据,因为解密数据所需的私钥是用用户的密码加密的,并且该密码(及其哈希值)不存储在数据库。
- 如果用户想要更改他们的密码,只需要重新生成他们的加密私钥(用旧密码/哈希解密私钥,然后用新密码/哈希重新加密)。
- 共享条目作为实际单独的记录存储在数据库中,因此无需在多个用户/用户组之间共享密钥。
缺点/问题(我能想到的):
- 如果共享条目被修改,系统必须重新加密每个子条目;由于有大量用户共享数据,这可能在计算上很昂贵。
- 共享条目依赖于父用户的公钥进行签名验证。如果用户被删除,或者他们的密钥发生变化,则签名无效。
从介绍中重复:我的问题是:这个实现安全吗?我错过了什么吗?如果是这样,上述规范甚至可以实施吗?或者这是矫枉过正?
谢谢你坚持这么久。我对你的意见很感兴趣!我是在正确的轨道上,还是一个彻头彻尾的白痴?你决定!:)
encryption - 电子邮件回复中的 RSA 技巧
A 对她的电子邮件使用 RSA 加密。B 找到一封给 A 的加密电子邮件:c = m^e mod n 他想知道纯文本。B 知道,当 A 回复她的电子邮件时,她总是在回复中包含她正在回复的消息的文本。
假设 A 只接收长度最多为 log n 的位串的消息,可以映射到 Zn。
还假设 B 不能简单地将 c 作为他自己的电子邮件发送给 A 并期望得到回复,但 A 将回复除 c 之外的电子邮件消息。
B 如何仅使用来自 Zn 的 c、e、n 和随机值来学习 m?
putty - 选美似乎有干扰,根本不起作用
我用我的公钥设置了一个服务器,并将我的私钥添加到 putty 允许我正确连接到服务器。但是,当我使用选美时,它不起作用。我的研究表明,运行选美的事件日志应如下所示:
....
选美正在运行。请求密钥。
选美有 X SSH-2 密钥
正在尝试选美密钥 #0
....
但是,我的事件日志看起来像
...
选美正在运行。请求密钥。
...
似乎选美没有响应 putty 的关键请求。对此的任何帮助将不胜感激。
谢谢
url - 使用公钥/私钥/证书限制对下载 URL 的访问
如何限制对我网站上 url 的访问,并且只允许我的客户端应用程序访问这些 url。我正在输入一个 rest api 来请求 url,并认为我可以像 AWS S3 那样使用公钥/私钥。我的理解是,在传输过程中我仍然需要 SSL 证书来保护数据。
这看起来是正确的方法吗?我也不确定如何在服务器端生成密钥。我在 Rails 和 php 中编码。
c# - 多方公钥密码术
虽然 2 方公钥加密在 .net 框架中得到了很好的布局,但我非常关心 n 方。例如保护两方视频会议。沟通很容易:
1) 每一方生成会话特定的 RSA 密钥对,并获得由受信任的权威机构(即受信任的服务器)签名的公钥。2)每一方交换密钥,ECDiffieHellmanCng
因此连接现在既真实又安全(认为他们使用Vista/W7)。
现在向此通信添加第三个参与者将不起作用,因为密钥交换算法旨在仅从 2 个公钥派生共享密钥(尤其是使用 .NET 和 BouncyCastle)。所以问题是,您将如何实施仍然是真实的(即抵抗中间人攻击)和安全(即防止窃听)的 n 方公钥加密模式。
编辑:目前的想法如下,我将继续实现最受欢迎的一个作为NBusy.Communicator库的一部分:
- 使用两方通信方案,其中一方充当联合服务器。
- 发起两方通信,让一方对第三方进行身份验证并共享秘密/对称密钥。
- 使用多方密钥协议方案。
Edit2:我将使用“n-Party Diffie Hellman”算法,类似于此处描述的算法,但有一些修改: http: //www.codeproject.com/KB/cs/diffy_helman.aspx
encryption - 我可以使用带有两个私钥的非对称加密吗?
根据维基百科(和其他来源),非对称加密总是这样工作:
- 甲方拥有公私钥
- 乙方用甲的公钥加密东西
- 甲方用他们的私钥解密东西
但是,我不希望甲方能够加密他们自己的数据,只希望他们能够解密它。使用不对称逻辑,这将导致:
- 甲方有私钥
- 乙方有一个私钥(即甲方的公钥)
- 乙方用他们的私钥加密东西
- 甲方用他们的私钥解密东西
我们将使用它来进行某种许可证生成/检查。我们的客户可能不会生成许可证,但许可证文件必须在客户端可读。
这仍然是非对称加密还是我应该寻找不同的方法?
php - SSL 替代方案 - 使用 JavaScript 加密密码提交给 PHP 进行解密
我正在建立一个网站,我的付款方式将是 Google Checkout 和 Paypal。会有链接/按钮将用户重定向到安全的 Google/Paypal 网站以处理付款。这意味着我不需要每年 150 美元的额外费用和为我的站点安装 SSL 证书的复杂性。
但是,我想在用户登录时加密用户的密码,这样如果他们在网络上,一些运行 FireSheep 等的恶意人员在发送到服务器时无法读取用户的实际密码。该站点的其余部分不需要加密,因为它不是真正的敏感数据,并且可能会显着降低用户体验。
我的想法是这可以用公钥加密来实现。可以说这个过程是这样的:
- 公钥在 JavaScript 外部文件中,私钥在服务器上的 PHP 中
- 用户在表单中输入他们的用户名和密码并点击提交
- JavaScript 运行并加密密码,将其存储回文本字段中
- 表单提交到服务器,密码用PHP解密
- PHP 中的纯文本密码经过加盐和哈希处理,然后与数据库中的哈希值进行比较。
- 注册/更改密码功能可能类似的过程。
我在想像 RSA 这样的东西可以解决问题。但是我在网上搜寻了一个可以工作的 JavaScript 库来做这件事,但似乎没有一个与可用的 PHP 库兼容。无论如何,它需要生成一组与 JavaScript 和 PHP 兼容的密钥。
有人知道这个的实际工作解决方案吗?如果不是,我们写一个怎么样,然后开源它。不幸的是,编写加密/解密代码非常复杂,所以我真的不知道现有库在做什么以及如何修改它们以使其工作。我已经对会话固定/劫持提供了保护,所以我对此不感兴趣。只是对在数据到达 Web 服务器之前对其进行加密感兴趣。
注意:请不要发布一堆指向独立 Javascript 或 PHP 加密库的链接,我已经在 Google 上找到了这些链接。这实际上没有用。我需要的是用于 JavaScript 加密和 PHP 解密的代码,它们实际上可以和谐地协同工作以产生上述预期结果。
另外,如果您可以避免发布诸如“仅使用 SSL”之类的评论。我实际上想要一个解决这个确切问题的方法,即使它不是最佳实践,它仍然会很有趣。
非常感谢!