- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用mailR
通过R发送电子邮件。这是我的代码
send.mail(from = [from],
to = [to],
subject = "msg",
body = "contents",
html = FALSE,
inline = FALSE,
authenticate = TRUE,
smtp = list(host.name = "smtp.gmail.com",
port = 465,
user.name = [username],
passwd = [password],
ssl = TRUE),
attach.files = "/home/User/outputlog.txt",
send = TRUE)
最佳答案
理论上是(对于“传输”的某些定义),但是实际上是“在传输中此消息是否被加密?”。答案可能是。简而言之,出于以下说明的所有原因,仅将ssl = True
或等效内容放置在某处几乎不能保证任何内容。
因此,您可能不会喜欢以下详细的响应,因为它基本上表明,没有什么简单的事情,即使您做对了所有事情并且有很多事情要做,也没有100%的保证。
另外,TLS是您正在使用的功能的真实名称,SSL自20天以来已经失效,是的,每个人都使用旧名称,但这仍然不能正确使用此功能。
首先,也是非常重要的,TLS提供了各种保证,其中包括机密性(内容在传输过程中被加密),还包括身份验证(在您的情况下更为重要),原因如下。
您需要确保正确解析smtp.gmail.com
,否则,如果您的服务器使用说谎的解析器,并且位于可重写DNS查询或响应的恶意网络中,那么您可以将加密的内容发送给...真实的“ smtp.gmail.com”,由于您将内容发送给陌生人或活跃的攻击者,因此该内容不再是机密的。
为了解决这个问题,如果您很认真,则基本上需要DNSSEC。
不,与许多人似乎相信和传达的观点相反,仅TLS甚至DOH(基于HTTPS的DNS)都无法解决这一问题。
为什么?由于以下原因,这并不是纯粹的理论,因为
即使发生在最近(https://www.bleepingcomputer.com/news/security/hacker-hijacks-dns-server-of-myetherwallet-to-steal-160-000/)上,即使它是在WWW世界中而不是在电子邮件中,情况也可能相同:
您设法获取与联系名称绑定的IP地址(这可以通过BGP劫持来完成,并且由于配置错误,“策略”原因或主动攻击而一直发生)
现在,您控制了所有通信,然后将所需的任何服务器放在其末尾
您可以联系任何提供DV证书的CA,包括那些完全自动化的证书
由于该名称现在基本上可以解析为您控制的IP,因此CA可以进行的网络(甚至DNS)验证将成功,并且CA将为您提供该名称的证书(即使在该证书结束后,该证书也可以继续使用) BGP劫持,因为CA可能不会很快撤消证书,并且客户端可能无法正确地检查证书)。
因此,任何接受此CA的TLS堆栈都将很乐意接受此证书,并且您的客户端会将包含TLS ...的内容安全地发送到目标以外的其他目标,因此实际安全性为0。
实际上,如上面的链接所示,攻击者甚至不必这么聪明:甚至可能会遇到自签名证书或主机名不匹配的情况,因为用户不会在意和/或库将具有不正确的默认行为和/或程序员使用该库将无法正确使用它(请参阅此引人入胜的内容,尽管现在有点陈旧,但该文件显示了许多具有错误默认行为的“ SSL”工具箱的非常可悲的状态,API混乱,各种错误使该工具的无效使用的可能性大大超过了正确的选择合理的TLS操作:https://www.cs.utexas.edu/~shmat/shmat_ccs12.pdf)
正确使用TLS不会使DNSSEC无关紧要。既针对又防御不同的攻击。您不仅需要使用一种安全性,还需要两种安全性,并且两种(正确使用的)任何一种都不能替代另一种。从来没有,也永远不会。
现在,即使解决方案正确,也可能有人(由于BGP)劫持了IP地址。然后,您再次向某台主机发送了一些加密的内容,但您并未真正验证谁是该主机,因此,如果攻击者设法劫持了smtp.gmail.com
的IP地址,则它可以是任何人(不需要这样做)。在全球范围内(仅在本地)执行代码的“周围”)。
这是身份验证非常重要的TLS属性启动的地方。
通常,这是通过X.509证书完成的(该证书将被错误地称为SSL证书)。通信的每一端都通过查看所提供的证书来对另一端进行身份验证:要么将此证书识别为特殊证书,要么将该证书的颁发机构识别为可信。
因此,您不仅需要连接smtp.gmail.com
上的TLS,还需要仔细检查随后提供的证书:
表示smtp.gmail.com
(而不是其他任何名称),并考虑了通配符
由您信任的证书颁发机构颁发
所有这些通常由您使用的TLS库处理,除了在许多情况下,您至少需要显式启用此行为(验证),并且,如果您要更加确定,则需要与信任的CA明确决定。否则,过去发生的攻击太多,例如流氓,不称职或其他形容词CA在不应该颁发证书的情况下发生过这种攻击(是的,没有人可以抵御这种攻击,即使Google和Microsoft过去也曾使用错误的证书潜在的破坏性后果)。
现在,您还有另一个更特定于SMTP和TLS上SMTP的问题:服务器通常会通告它执行TLS,而客户端看到此消息后便可以开始TLS交换。然后一切都很好(上述所有内容除外)。
但是,在SMTP服务器与您之间的路径中,有人可以重写第一部分(明确内容),以便删除此SMTP服务器所说的TLS的信息。然后,客户端将看不到TLS,并将继续(取决于它的开发方式,当然,在这种情况下,为了确保安全,客户端应中止通信),然后进行明确的发言。这称为降级攻击。请参见此详细说明,例如:https://elie.net/blog/understanding-how-tls-downgrade-attacks-prevent-email-encryption/
正如Steffen所指出的,基于您正在使用的是上述SMTP STARTTLS问题的端口,因此不存在可能的降级,因为这是针对未使用的端口25的。但是,我仍然希望向用户发出警告,因为这种情况可能并不为人所知,降级攻击通常既难以检测又难以防御(所有这些都是因为当今使用的协议是在不需要甚至考虑在路径上防御恶意行为者)
然后,您当然会遇到所使用的TLS版本及其参数的问题。现在的标准是TLS 1.3版,但是它仍在缓慢地部署到任何地方。您会发现许多仅知道1.2的TLS服务器
如果采取一些预防措施,这可能就足够了。但是您还会发现旧版本的TLS 1.1、1.0甚至更糟(即SSL 3)。如果安全客户端代码无法确保至少TLS 1.2连接的安全,则应拒绝继续交换数据包。
同样,这通常都由“ SSL”库处理,但同样,您必须进行检查,启用正确的设置等。
您也有类似的降级攻击问题:服务器无意间首先就清楚地宣传了其提供的内容,因此,攻击者可以对其进行修改,以删除“最高”安全版本,以迫使客户端使用具有更高安全级别的较低版本。攻击(针对TLS 1.0和1.1的攻击有多种)。
有一些解决方案,特别是在TLS 1.3和1.2(https://tools.ietf.org/html/rfc7633中:“ TLS功能扩展的目的是防止降级
TLS协议无法阻止的攻击。”)
除了Steffen的观点外,我不认为TLS降级攻击纯粹是理论上的。一些例子:
(从2014年开始):https://p16.praetorian.com/blog/man-in-the-middle-tls-ssl-protocol-downgrade-attack(主要是因为Web浏览器渴望连接,无论通常情况下,如果尝试使用最高设置失败,它们都将回退到较低版本,直到找到发生连接的情况)
https://tools.ietf.org/html/rfc7507特别提供了一种保护措施,指出:“所有不必要的协议降级都是不可取的(例如,来自TLS的降级)
如果客户端和服务器都确实支持,则从1.2到TLS 1.1
TLS 1.2);当结果是失去
通过降级到SSL 3.0来实现TLS扩展功能。这个文件
定义可用于防止意外协议的SCSV
在符合本文档的客户端和服务器之间降级
通过让客户端指示当前的连接尝试是
只是一个后备,并通过让服务器返回致命警报(如果它
检测到不适当的后备。”
https://www.nccgroup.trust/us/about-us/newsroom-and-events/blog/2019/february/downgrade-attack-on-tls-1.3-and-vulnerabilities-in-major-tls-libraries/在2018年讨论了不少于5个允许TLS攻击的CVE:“存在两种攻击TLS 1.3的方法。在每种攻击中,服务器也需要支持较旧版本的协议。[..]第二种依赖于这样的事实:两个对等点都支持旧版本的TLS和带有支持RSA密钥交换的密码套件。”和“之所以如此强大,是因为唯一已知的针对TLS 1.3的降级攻击。”和“除了协议降级之外,还存在其他技术可迫使浏览器客户端回退到较旧的TLS版本:网络故障,欺骗性的TCP RST数据包,缺乏响应等(请参见POODLE)”。
即使使用正确的版本,也需要确保使用正确的算法,密钥大小等。有时某些服务器/库启用“ NULL”加密算法,这实际上意味着没有加密。当然很傻,但是确实存在,这是一个简单的例子,还有更复杂的例子。
斯特芬(Steffen)的另一篇文章:https://serverfault.com/a/696502/396475总结并触及了以上各点,并就最重要的内容提供了另一种观点(我们对此表示不同意见,但他也在此处回答,因此任何人都可以自由考虑这两种观点并提出他们自己的意见)。
因此,MTA-STS而不是SMTP STARTTLS,https://tools.ietf.org/html/rfc8461具有以下清晰的摘要:
SMTP MTA严格传输安全性(MTA-STS)是一种机制
使邮件服务提供商(SP)声明其能力
接收传输层安全性(TLS)安全SMTP连接和
指定发送SMTP服务器是否应拒绝传递到
不提供带有受信任服务器证书的TLS的MX主机。
因此,您需要确保您发送电子邮件的主机也确实使用了该功能,并且您的客户端已正确编程以处理该功能。
再一次,可能是在“ SSL库”内部完成的,但这显然表明您需要在其中使用SMTP的特定位,并且您需要联系网络服务器以检索远程端SMTP策略,并且还需要执行DNS请求,然后返回关于您是否信任您的解析器以及记录是否受DNSSEC保护的较早的观点之一。
以上所有内容已经涵盖了许多领域并且确实很难正确完成,但仍有许多其他要点...
让我们假设运输是安全的。但是,如何获取内容呢?您可能会说这不再是您的问题。也许。也许不吧。您要为此承担责任吗?这意味着您可能还应该对附件本身进行加密,这是对传输进行了保护(而不是替代)。
确保电子邮件内容安全的默认机制是使用OpenPGP(对此有更多的怪异之处)或S / MIME(对它有更多的企业联系)。这适用于一切。然后,您将根据文档获得特定的解决方案(但这不能解决保护电子邮件正文的问题),例如PDF文档可以通过密码进行保护(警告:过去已被破解)。
我正在发送敏感信息
然后,这可能会包含一些合同或某些规范,具体取决于您的业务领域。您可能想更深入地了解这些要求,以确切了解对您的要求是什么,如果您正确地确保了所有其他内容,则对某些问题不承担责任。
关于r - SSL是否适合发送安全内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55821053/
我正在制作一个简单的程序来更改我的计算机背景。我在网上发现了一个stackoverflow问题,或多或少涵盖了我想做的事情。我现在可以成功地将我的墙纸更改为平铺、居中和从在线图像 URL 拉伸(str
是的,这是另一个每组最大的问题之一!我已经尝试了几天,试图解决这个问题,但无济于事。我也一直在寻找,但我什至不知道我是否在正确的地方寻找。问题的最简化版本如下。 我有 2 个表,一个是多对多表,另一个
我想解析一些数据,我有一个 BNF 语法来解析它。谁能推荐任何能够生成可在移动设备上使用的代码的语法编译器? 由于这是针对 JavaME 的,因此生成的代码必须是: 希望很小 对外来 Java 库的依
我有一个动物园时间序列对象,vels : 2011-05-01 00:00:00 7.52 2011-05-01 00:10:00 7.69 2011-05-01 00:20:00 7.67 2011
我想创建一个供小型制造公司使用的生产管理系统。该系统将允许记录设备制造的不同阶段。要求如下: 1.非基于浏览器的界面。需要基于 Swing 或 AWT 的东西。虽然我了解实现基于浏览器的解决方案的便利
是否有任何 java 或 clojure 邮件库可以实现 lamson 的功能?特别是lamson的邮件路由功能非常酷http://verpa.wordpress.com/2010/11/13/mak
sklearn 中的 fit() 方法似乎在同一界面中服务于不同的目的。 应用于训练集时,像这样: model.fit(X_train, y_train) fit() 用于学习稍后将在测试集上使用 p
我使用 OSM 显示县的边界。它在大多数情况下工作得很好,但在某些情况下,县更大并且不适合 map 。 如何在开始渲染之前调整缩放级别? var map = L.map("mapCnty").setV
我正在致力于缩小和丑化我的 javascript 文件。我想知道合适的尺寸是多大。如果我将所有js文件合并成一个文件(经过缩小和丑化),它会大于1mb。我想,最好将它们分成 2-3 个文件(每个文件
我是 Java 新手。 我想在 GridPane 中放置一个 TextArea。我在过去几个小时内尝试了此操作,结果如下: 如您所见,TextArea 比我的 Gridpane 大得多。这是我的代码:
sklearn 中的 fit() 方法似乎在同一界面中服务于不同的目的。 应用于训练集时,像这样: model.fit(X_train, y_train) fit() 用于学习稍后将在测试集上使用 p
我认为这是一个基本问题,但也许我混淆了这些概念。 假设我使用 R forecast 包中的函数 auto.arima() 将 ARIMA 模型拟合到时间序列。该模型假设方差不变。我如何获得该方差?是残
我使用 OSM 显示县的边界。它在大多数情况下工作得很好,但在某些情况下,县更大并且不适合 map 。 如何在开始渲染之前调整缩放级别? var map = L.map("mapCnty").setV
我有一个很长的标签,这是我的第一个标签,我想把它放在我的单元格中。这就是我所拥有的,但它不起作用。 我有一个自定义的 UITabelviewCell ,里面有几个标签。 -(CGFloat)table
假设我有一个包含 WCS header 的 FITS 文件,这样我就可以执行以下操作: #import healpy as hp #import astropy.io.fits as pyfits #
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 已关闭10 年前。 Improve
我们正在构建一个与其他系统有多个集成接触点的应用程序。我们有效地使用 Unity 来满足我们所有的依赖注入(inject)需求。整个业务层是用接口(interface)驱动的方法构建的,实际实现在应用
我得到了 MKMapView 和一些注释。我使用下一个代码来显示所有注释: NSArray *coordinates = [self.mapView valueForKeyPath:@"annotat
我在一家托管公司工作,我们经常收到安装、新域、滞后修复等方面的请求。为了大致了解仍然开放的内容,我决定制作一个非常简单的票务系统。我有一点 php 知识和一点 MySQL 知识。目前,我们将根据客户的
我想向我的 UITableView 添加背景图像,它适合 UI,还具有导航 Controller 和工具栏。在那种情况下,我没有找到适合 iPhone 和 iPad 不同屏幕的 tableview 的
我是一名优秀的程序员,十分优秀!